考虑下面这个简短的 C + + 程序:
#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
,所有编译器都会同样地生成 false
作为输出。
另一方面,如果我将这两个类组合在一起(两个操作符将在同一个类中) ,所有三个编译器将生成 true
输出。