对重载函数find_first_not_of的不明确调用

ambiguous call to overloaded function find_first_not_of

本文关键字:of 不明确 调用 not first 重载 函数 find      更新时间:2023-10-16

错误 C2668: 'std::basic_string<wchar_t,std::char_traits>,std::分配器<:wchar_t>>::find_first_not_of":对重载函数的不明确调用

我在Visual Studio 2013中收到此错误,但在MinGW中没有。我能用这个做什么?

我尝试添加cache.std::wstring::find_first_not_of,但这没有帮助。

我的代码:

wstring cache = key.GetExpandStringValue(L"Path");
int empregnul = 0;
if(cache.find_first_not_of('') == wstring::npos)
{
empregnul = 1;
}

我认为 MSVC 拒绝您的代码不符合标准,至少从 C++14 开始。您正在使用早于 C++14 的版本,因此显然不支持它,但更高版本的 MSVC 版本仍然会产生相同的歧义错误,即使/std:c++14/std:c++latest并给出/permissive-标志,请参阅 hhttps://godbolt.org/z/fQA4YD。但也要注意本回答末尾关于最新版本的 MSVC 的评论。

MSVC 似乎认为''可以转换为空指针,因为它是空指针常量

这将使find_first_not_ofwchar_t作为参数的重载和将const wchar_t*作为参数的重载同样是很好的匹配。

您可以看到这是 MSVC 通过将字符值更改为零以外的任何内容来解释歧义的原因,例如'a',在这种情况下,MSVC认为调用是明确的。

但是,在 CWG 第 903 期作为缺陷报告得到解决后,C++14 标准(最终草案(和更高标准 [conv.ptr]/1 中的相关段落说:

空指针常量是值为零或 std::nullptr_t 类型的 prvalue 的整数文本 ([lex.icon](。

''字符文本,而不是整数文本。因此,它不是空指针常量,不能转换为指针,从而使调用明确。

在解决 CWG 问题 903 之前,任何整数类型和值零的右值常量表达式都是空指针常量,因此在这种情况下,MSVC 给出歧义是正确的。但这并不能解释较新版本和 C++14(或更高版本(标志中的行为。

这可以通过使用L''而不是''来解决,因为L''具有类型wchar_t,因此它与期望wchar_t的重载完全匹配,而期望const wchar_t*的重载需要转换(假设甚至允许转换(,使前者成为更好的匹配并解决歧义。

上面提到的修复也是您应该做的,即使没有错误(尽管在这种特定情况下无关紧要(。您不想将charwchar_t混为一谈。使用wchar_t/wstring时,请始终在字符文本和字符串文本前面添加L,以赋予它们正确的类型。


正如@RaymondChen在此问题下的评论中指出的那样,较新版本的 MSVC(在 godbolt 上不可用(在给出/permissive-标志时确实实现了 CWG 903 的决议,请参阅将整数常量表达式隐式转换为空指针。