繁体   English   中英

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

[英]ambiguous call to overloaded function find_first_not_of

错误 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;
}

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

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

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

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

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

空指针常量是具有零值的整数文字 ([lex.icon]) 或类型为 std::nullptr_t 的纯右值。

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

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

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

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM