Изменить: я переформатировал сообщение, чтобы быть более четким.
Почему это работает:
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
для добавления. Почему это? Существует ли фундаментальное свойство, предотвращающее это?