错误C2668:'std :: basic_string <wchar_t,std :: char_traits <wchar_t>,std :: allocator&lt: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('\0') == wstring::npos)
{
empregnul = 1;
}
我认为,至少从C ++ 14开始,通过拒绝您的代码,MSVC不符合标准。您使用的版本早于C ++ 14,因此显然不支持该版本,但是更高版本的MSVC版本仍然会产生相同的歧义错误,即使给出了/std:c++14
or/std:c++latest
和/permissive-
flag,请参见hhttps://godbolt.org/z / fQA4YD。但也请注意此答案末尾有关最新版本的MSVC的评论。
MSVC似乎认为'\0'
可以将其转换为空指针值,因为它是一个空指针常量。
这将使过载find_first_not_of
以wchar_t
作为参数,过载以const wchar_t*
作为参数,同样精彩的比赛。
您可以看到,这是MSVC造成歧义的原因,方法是将字符值更改为除零以外的任何值,例如'a'
,在这种情况下,MSVC认为调用是明确的。
但是,在将CWG第903号决议作为缺陷报告解决后,C ++ 14标准(最终草案)[conv.ptr] / 1中的相关段落说:
甲空指针常数是整数字面([lex.icon])与零值或类型的std的prvalue :: nullptr_t。
'\0'
是字符文字,不是整数文字。因此,它不是一个空指针常量,因此不能将其转换为指针,从而使调用变得明确。
在CWG问题903之前,整数类型和值为零的任何右值常量表达式都是空指针常量,因此在这种情况下,MSVC是正确的以给出歧义。但这并不能解释在较新版本和C ++ 14(或更高版本)标志中的行为。
这可以通过使用L'\0'
代替来解决'\0'
,因为它L'\0'
具有type wchar_t
,因此它与预期的重载wchar_t
完全匹配,而预期的重载const wchar_t*
将需要转换(假设甚至允许转换),从而使前者更好地匹配并解决了歧义。
即使没有错误(尽管在此特定情况下也没有关系),上述修复仍然是您应该采取的措施。您不想与混char
在一起wchar_t
。使用wchar_t
/时,请wstring
始终L
在字符文字和字符串文字之前添加,以为其指定正确的类型。
正如@RaymondChen在此问题下的评论中指出的那样,当给出该标志时,较新版本的MSVC(在godbolt上不可用)确实实现了CWG 903的分辨率/permissive-
,请参阅将整数常量表达式隐式转换为null指针。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句