C++ 中构造函数从 char 到 int 的隐式转换
Implicit conversion from char to int for constructors in C++
class A {
int x;
std::string s;
public:
A(std::string _s): x(0), s(_s) {
std::cout << "\tA(string)\n" ;
}
A(int _x): x(_x), s("") {
std::cout << "\tA(int)\n" ;
}
A(const A &other): x(other.x), s(other.s) {
std::cout << "\tA(A& other)\n" ;
}
};
int main() {
std::string str = "Hello";
A obj_1(str);
A obj_2 = str;
A obj_3(10);
A obj_4 = 10;
char ch = 'a';
A obj_5 = ch; // How is this working?
// A obj_6 = "Hello"; // And not this?
const char *ptr = "Hello";
// A obj_7 = ptr; // or this?
return 0;
}
执行此代码时,输出为:
A(string)
A(string)
A(int)
A(int)
A(int)
据我了解,obj_1
和 obj_3
是使用各自的 ctors 直接创建的。对于 obj_2
和 obj_4
,编译器通过调用它们各自的构造函数进行隐式转换(因此在每种情况下只需要 1 次隐式转换)。但是,对于 obj_5
,编译器首先必须从 char 转换为 int,然后再进行一次隐式转换以调用 int-ctor。但是 C++ 标准只允许 1 个隐式转换。那么这里发生了什么?
此外,在那种情况下,"Hello"
应该首先转换为 std::string
,然后再进行一次隐式转换以调用 string-ctor。但这是行不通的。
But C++ standard allows only 1 implicit conversion.
那是不正确的。
来自cppreference:
Implicit conversion sequence consists of the following, in this order:
- zero or one standard conversion sequence;
- zero or one user-defined conversion;
- zero or one standard conversion sequence.
从语言的角度来看,const char[N]
-> std::string
(或const char*
到std::string
)是用户自定义的转换。因此,注释掉的行是错误。另一方面,
A obj_5 = ch; // How is this working?
很好,因为只涉及一个用户定义的转换。
class A {
int x;
std::string s;
public:
A(std::string _s): x(0), s(_s) {
std::cout << "\tA(string)\n" ;
}
A(int _x): x(_x), s("") {
std::cout << "\tA(int)\n" ;
}
A(const A &other): x(other.x), s(other.s) {
std::cout << "\tA(A& other)\n" ;
}
};
int main() {
std::string str = "Hello";
A obj_1(str);
A obj_2 = str;
A obj_3(10);
A obj_4 = 10;
char ch = 'a';
A obj_5 = ch; // How is this working?
// A obj_6 = "Hello"; // And not this?
const char *ptr = "Hello";
// A obj_7 = ptr; // or this?
return 0;
}
执行此代码时,输出为:
A(string)
A(string)
A(int)
A(int)
A(int)
据我了解,obj_1
和 obj_3
是使用各自的 ctors 直接创建的。对于 obj_2
和 obj_4
,编译器通过调用它们各自的构造函数进行隐式转换(因此在每种情况下只需要 1 次隐式转换)。但是,对于 obj_5
,编译器首先必须从 char 转换为 int,然后再进行一次隐式转换以调用 int-ctor。但是 C++ 标准只允许 1 个隐式转换。那么这里发生了什么?
此外,在那种情况下,"Hello"
应该首先转换为 std::string
,然后再进行一次隐式转换以调用 string-ctor。但这是行不通的。
But C++ standard allows only 1 implicit conversion.
那是不正确的。
来自cppreference:
Implicit conversion sequence consists of the following, in this order:
- zero or one standard conversion sequence;
- zero or one user-defined conversion;
- zero or one standard conversion sequence.
从语言的角度来看,const char[N]
-> std::string
(或const char*
到std::string
)是用户自定义的转换。因此,注释掉的行是错误。另一方面,
A obj_5 = ch; // How is this working?
很好,因为只涉及一个用户定义的转换。