对重载函数的模糊调用 find_first_not_of

ambiguous call to overloaded function find_first_not_of

error C2668: 'std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator&lt:wchar_t>>::find_first_not_of' : ambiguous call to overloaded function

我在 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('[=11=]') == wstring::npos)
{
    empregnul = 1;
}

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

MSVC似乎认为'[=13=]'可以转换为空指针值,因为它是一个空指针常量 ].

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

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

然而,在C++14标准(最终草案)及以后的标准CWG issue 903 as defect report, the relevant passage in [conv.ptr]/1决议后说:

A null pointer constant is an integer literal ([lex.icon]) with value zero or a prvalue of type std::nullptr_t.

'[=13=]' 字符文字 ,而不是 整数文字 。因此它不是空指针常量,不能转换为指针,使调用明确。

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

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

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


正如@RaymondChen 在此问题下的评论中所指出的,更新版本的 MSVC(在 godbolt 上不可用)do 执行 CWG 903 的决议时/permissive- 标志已给出,参见 Implicit conversion of integral constant expressions to null pointer