Этот код компилируется и выполняется либо с открытым неявным приведением типа bool (закомментировано ниже, в http://ideone.com/FDJHB), либо с помощью открытого неявного преобразования типа int, за которым следует неявное приведение типа int к bool (как показано ниже, http://ideone.com/kHQ46). Тем не менее, сделав преобразование bool закрытым (закомментировано ниже, в http://ideone.com/4poze), возникает ошибка компиляции. Почему в этом случае маршрут через int больше не является опцией? Определенное поведение имеет последовательное приведение типа этого?Спасибо.
http://ideone.com/kHQ46
#include <iostream>
class MyObject {
public:
MyObject(int theInt) : theInt_(theInt) {
return;
}
MyObject& operator=(MyObject& source) {
std::cout << "assign op" << std::endl;
theInt_ = source.theInt_;
return *this;
}
friend MyObject operator*(MyObject& lhs, MyObject& rhs);
operator int() {
std::cout << "int conv" << std::endl;
return theInt_;
}
/*
operator bool() {
std::cout << "bool conv" << std::endl;
return theInt_;
}
*/
private:
int theInt_;
MyObject(MyObject& source);
// operator bool();
};
MyObject operator*(MyObject& lhs, MyObject& rhs) {
std::cout << "mult op" << std::endl;
return MyObject(lhs.theInt_*rhs.theInt_);
}
int main(int argc, char* argv[]) {
MyObject a(1);
MyObject b(2);
MyObject c(3);
if (a * b = c) std::cout << "Oh-no!" << std::endl;
return 0;
}
РЕДАКТИРОВАТЬ: По запросу соответствующие сообщения компилятора.
1) Вывод для данного кода, приведенный к int в bool:
мультиоператор
int conv
назначить op
int conv
О-нет!
2) Вывод для кода с публичным приведением типа bool:
mult op
int conv
assign op
bool conv
Oh-нет!
3) Ошибка компилятора, если преобразование bool сделано приватным:
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:34: error: ‘MyObject::operator bool()’ is private
prog.cpp:50: error: within this context