c++ - 函数重载和类型转换解析

标签 c++ operator-overloading type-conversion overloading

为什么我们在下面的代码中看不到“未定义的重载函数调用”错误?仅仅因为 int 是内置类型?我可以在标准的哪个位置找到转换为内置类型的保证,例如在下面的代码中?...谢谢!

#include <iostream>
using namespace std;

class B {
public:
operator int(){ return 0; }
};

class A {
public:
A( int i ) { };
};

void f ( int i ) { cout << "overload f(int) was used!";};
void f ( A a )   { cout << "overload f(A) was used!" ;};


int main () {
  B b;
  f( b );
}

最佳答案

它与内置类型无关。您为 B 定义了 operator int。这意味着您已经提供了从 Bint 的用户定义转换。根据标准的 12.3.4,“最多一个用户定义的转换(构造函数或转换函数)隐式应用于单个值。”这就是它没有转换为 A 的原因,因为这需要两次隐式转换。

准确确定何时发生这种情况的规则有些复杂,因此许多人建议您避免提供用户定义的转换。定义这些的另一种方法是为构造函数提供一个参数;您可以将 explicit 添加到开头以避免它被隐式应用。

当您调用 f(b) 时,编译器应用您提供的转换将 b 转换为 int。如果要将其转换为 A,则必须定义从 BA 的转换,或者显式应用其中一种转换,例如 f(int(b))f(A(b))

关于c++ - 函数重载和类型转换解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12799841/

相关文章:

c++ - 为什么我的重载 >> 运算符会抛出 bad_alloc?

c++ - 这个从 long in a union 到 char* 和 back 的转换是做什么的?

c++ - 返回一个临时对象是否会在 C++ 中创建一个临时对象?

php - 通过PHP保存到MySQL TIME和DATE数据类型

c++ - 纯虚函数

c++ - 采用函数指针的函数模板的干净实现

C++ const重载赋值运算符机制

c++ - 在 C++17 中声明大小为 0 的数组是否合法?

c++ - 从tornado客户端发送http请求到异步cpp-netlib服务器

c++ - 运算符重载 C++/我的代码放在哪里?