这段代码不应该编译,为什么呢? if表达式中的上下文原理是什么?
class B {
public:
B() {}
explicit operator bool () {}
};
int main (){
B Bp;
//bool check = Bp // error
if (Bp){ //o.k
return 1;
}
return 0;
}
由于
答案 0 :(得分:3)
该代码非常应该编译。该标准耗费了大量精力来确保它确实。
有很多地方表达式“在上下文中转换为bool”在这些地方,explicit
bool转换将被调用(如果它们可用)。其中一个上下文转换是if
表达式,就像您的情况一样。
此语言允许explicit operator bool
类型仍然用于条件检查if(expr)
,但如果没有显式转换,则无法使用其他内容。你不能将它传递给一个bool
的函数;你不能从返回bool
的函数返回它,等等。
所有上下文转换都是语言功能中的显式表达。因此,explicit operator bool
可以保护您免受隐式用户定义的转换,同时仍允许语言定义的转换发生。