Рассмотрим следующую короткую программу на С++:
#include <iostream>
class B {
public:
operator bool() const {
return false;
}
};
class B2 : public B {
public:
operator int() {
return 5;
}
};
int main() {
B2 b;
std::cout << std::boolalpha << (bool)b << std::endl;
}
Если я скомпилирую его на разных компиляторах, я получаю различные результаты. С Clang 3.4 и GCC 4.4.7 он печатает true
, а Visual Studio 2013 печатает false
, что означает, что они вызывают разные операторы трансляции в (bool)b
. Какое правильное поведение соответствует стандарту?
В моем понимании operator bool()
не требуется преобразование, а operator int()
требуется преобразование int
в bool
, поэтому компилятор должен выбрать первый. Делает ли const
что-то с этим, const-conversion считается более "дорогим" компилятором?
Если я удаляю const
, все компиляторы одинаково производят false
как вывод.
С другой стороны, если я объединю два класса вместе (оба оператора будут в одном классе), все три компилятора произведут вывод true
.