对重载函数find_first_not_of的模糊调用

错误C2668:'std :: basic_string ,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;
}
fkdswfwqfet 回答:对重载函数find_first_not_of的模糊调用

我认为,至少从C ++ 14开始,通过拒绝您的代码,MSVC不符合标准。您使用的版本早于C ++ 14,因此显然不支持该版本,但更高版本的MSVC仍然会产生相同的歧义错误,即使使用/std:c++14/std:c++latest和{{1 }}标志,请参见hhttps://godbolt.org/z/fQA4YD。但也请注意此答案末尾有关最新版本的MSVC的评论。

MSVC似乎认为/permissive-可以转换为空指针值,因为它是空指针常量

这将使以'\0'作为参数的find_first_not_of的重载和以wchar_t作为参数的重载具有相同的匹配性。

您可以通过将字符值更改为除零以外的任何值来了解这是MSVC产生歧义的原因。 const wchar_t*,在这种情况下,MSVC认为该呼叫是明确的。

然而,在将CWG issue 903解析为缺陷报告之后,C ++ 14标准(最终草案)和更高版本的标准在[conv.ptr]/1中的相关段落说:

空指针常量是一个整数文字([lex.icon]),其值为零或prvalue为std :: nullptr_t类型。

'a'字符文字,而不是整数文字。因此,它不是一个空指针常量,因此无法将其转换为指针,从而使调用变得明确。

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

这可以通过使用'\0'而不是L'\0'来解决,因为'\0'的类型为L'\0',因此它与预期wchar_t的重载匹配>完全,而预期wchar_t的重载将需要进行转换(假设甚至允许进行转换),从而使前者更好地匹配并解决了歧义。

即使没有错误(尽管在此特定情况下也没有关系),上述修复仍然是您应该采取的措施。您不想将const wchar_t*char混合使用。使用wchar_t / wchar_t时,请始终在字符文字和字符串文字之前添加wstring,以为其指定正确的类型。


正如@RaymondChen在此问题下的评论中指出的那样,当L时,较新版本的MSVC(在godbolt上不可用) do 实现了CWG 903的分辨率。标记,请参见Implicit conversion of integral constant expressions to null pointer

本文链接:https://www.f2er.com/2715767.html

大家都在问