c++ - 对重载函数 find_first_not_of 的模糊调用

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

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('\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_of 的过载服用wchar_t作为参数,重载采用 const wchar_t*作为参数同样很好的匹配。

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

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

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


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

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

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

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

正如@RaymondChen 在此问题下的评论中所指出的那样,最新版本的 MSVC(在 Godbolt 上不可用)在 /permissive-给出标志,见 Implicit conversion of integral constant expressions to null pointer .

关于c++ - 对重载函数 find_first_not_of 的模糊调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59903841/

相关文章:

c++ - Qt 窗口不会使用其他类的 "this->close()"关闭

.net - 不要为复杂解决方案中的每个 Web 项目启动 Visual Web Developer 服务器

visual-studio - Visual Studio 键绑定(bind)配置文件

MFC : creating a hyperlink in a button

c++ - 知道其公共(public) ID 的拆分数据

c++ - Qt:即使失去焦点也将子窗口保持在父窗口之上

c++ - 分配给非常量引用

.net - 对于 .NET winforms datagridview 我希望组合框列的每一行都有一组不同的值

c++ - 如何在 VS 2017 中编译其他编译器的代码

c++ - Release模式和 Debug模式之间的编译时间差异