C++ 对重载函数find\u first\u not\u的调用不明确

C++ 对重载函数find\u first\u not\u的调用不明确,c++,visual-studio,visual-c++,visual-studio-2013,C++,Visual Studio,Visual C++,Visual Studio 2013,错误C2668:'std::basic_string>:'find_first_not_of':对重载函数的调用不明确 我在Visual Studio 2013中遇到此错误,但在MinGW中没有。我能用这个做什么 我尝试添加cache.std::wstring::find_first_not_of,但这没有帮助 我的代码: wstring cache=key.GetExpandStringValue(L“路径”); int empregnul=0; if(cache.find_first_not

错误C2668:'std::basic_string>:'find_first_not_of':对重载函数的调用不明确

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

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

我的代码:

wstring cache=key.GetExpandStringValue(L“路径”);
int empregnul=0;
if(cache.find_first_not_of('\0')==wstring::npos)
{
皇帝=1;
}

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

MSVC似乎认为
'\0'
可以转换为空指针值,因为它是一个空指针常量

这将使
find\u first\u的重载与
wchar\u t
作为参数的重载和
const wchar\u t*
作为参数的重载同样匹配

您可以看到,这是MSVC对歧义的推理,将字符值更改为除零以外的任何值,例如
'a'
,在这种情况下,MSVC认为调用是明确的

但是,在解决as缺陷报告后,C++14标准(最终草案)和更高版本标准的相关条款规定:

空指针常量是一个值为零的整数文本([lex.icon])或std::nullptr\t类型的prvalue

“\0”
是字符文字,而不是整数文字。因此,它不是空指针常量,不能转换为指针,从而使调用明确无误

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

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

上面提到的修复也是您无论如何都应该做的,即使没有错误(尽管在这种特定情况下这并不重要)。您不想将
char
wchar\t
混合使用。使用
wchar\u t
/
wstring
时,始终在字符和字符串文本前面添加
L
,以提供正确的类型



正如@RaymondChen在该问题下的评论中指出的,当给出
/permissive-
标志时,MSVC的最新版本(在godbolt上不可用)确实实现了CWG 903的解析,请参见。

尝试
L'\0'
…谢谢,
L
帮助了我。@Debugger55-你明白为什么吗?你需要说
/permissive-
才能让MSVC投诉。请参阅。@RaymondChen感谢您的提示,但至少字符文字到指针的赋值仍然使用
/permissive-
编译,OP的代码仍然导致歧义。这是预期的/已知的行为吗?@RaymondChen抱歉,我认为godbolt的版本已经过时,您的链接提到这是对更新版本的改进。我现在没有任何方法在当前的MSVC版本上测试这个。