我认为,至少从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