【问题标题】:ambiguous call to overloaded function find_first_not_of对重载函数 find_first_not_of 的模糊调用
【发布时间】:2020-05-11 05:13:17
【问题描述】:

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

【问题讨论】:

标签: c++ visual-studio visual-c++ visual-studio-2013


【解决方案1】:

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

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

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

您可以看到这是 MSVC 通过将字符值更改为不为零的任何值来解释歧义的原因,例如'a',在这种情况下,MSVC 认为调用是明确的。

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

空指针常量是一个整数文字 ([lex.icon]),其值为 0 或 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- 标志为给定,见Implicit conversion of integral constant expressions to null pointer

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2014-09-05
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多