编辑:我已经重新排版这篇文章,使其更加清晰明了。
为什么这个有效:
struct A {};
struct B {
B(A){}
};
void operator+(const B&, const B&) {}
int main()
{
A a1, a2;
a1 + a2;
}
而这个不行吗?
struct B {
B(const char*){}
};
void operator+(const B&, const B&) {} //error: invalid operands of types 'const char [6]' and 'const char [6]' to binary 'operator+'|
int main()
{
"Hello" + "world";
}
基本上,在第一个示例中,a1
和a2
都通过隐式转换转换为B
对象,并使用operator+(const B&, const B&)
进行相加。
根据这个例子,我原本期望"Hello"
和"world"
也会通过隐式构造函数转换为B
对象,并使用operator+(const B&, const B&)
相互相加。但实际上出现了错误,这表明C风格的字符串没有尝试将其转换为B
以进行相加。为什么会这样?是否存在某种基本属性以防止这种情况发生?
std::string
与"stack" + "overflow"
结合起来。 - πάντα ῥεῖstd::string
对他没有起作用。 - Baum mit Augenconst char*
没有转换运算符,但是通过std::string
的构造函数进行转换。这个可能更加适合。 - Baum mit Augen