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