c++ - 文字 `0` 是 int 和 const string& 重载的有效候选者会导致模棱两可的调用
问题描述
我最近修复了一个错误。
在下面的代码中,重载函数之一是 const 而另一个不是。该问题将通过将两个函数设为 const 来解决。
我的问题是为什么编译器只在参数为 0 时才抱怨它。
#include <iostream>
#include <string>
class CppSyntaxA
{
public:
void f(int i = 0) const { i++; }
void f(const std::string&){}
};
int main()
{
CppSyntaxA a;
a.f(1); // OK
//a.f(0); //error C2666: 'CppSyntaxA::f': 2 overloads have similar conversions
return 0;
}
解决方案
0
在 C++ 中是特殊的。空指针的值是 ,0
因此 C++ 将允许转换为0
指针类型。这意味着当你打电话时
a.f(0);
您可以使用值为 的 进行调用void f(int i = 0) const
,int
也0
可以void f(const std::string&)
使用char*
初始化为 null 的方式进行调用。
通常int
版本会更好,因为它是完全匹配的,但在这种情况下int
版本是const
,因此它需要“转换”a
为 a const CppSyntaxA
,其中std::string
版本不需要这样的转换,但确实需要先转换为char*
,然后再转换为std::string
。这在两种情况下都被认为是足够的变化,从而被认为是相等的转换,因此是模棱两可的。使这两个函数const
或非函数const
将解决问题,并且int
将选择重载,因为它更好。
推荐阅读
- c++ - 使用 cmake、mingw 的 C++ 中的 MySQL 和 MariaDB 库
- azure - 使用“Microsoft.Azure.KeyVault”SDK 的客户端代码如何设法让 Azure AD 令牌通过 Azure keyvault 进行身份验证以检索机密?
- python - 使用具有可变数量参数的函数字典 - 我可以在这里使用 partial 吗?
- node.js - 当我尝试登录时 Auth0 返回错误
- casting - 包含项目的 const-propagation
- flutter - 颤振初始化失败
- angular - Angular 导入子模块导致父模块的组件损坏
- java - 我可以将 Flux 作为 ServerResponse 正文的一个字段吗?
- php - 是否有可以在任何 PHP 网站中使用的通用身份验证模块?
- mysql - 内连接mysql性能搜索产品