作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这段代码不应该编译,为什么会编译呢?
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
如果它们可用,将调用 bool 转换。这些上下文转换之一是 if
表达,就像你的情况。
此语言允许 explicit operator bool
仍用于条件检查的类型 if(expr)
,但是如果没有显式转换,你就不能做其他事情。你不能把它传递给一个接受 bool
的函数。 ;你不能从返回 bool
的函数中返回它,等等。
所有上下文转换都是语言特性中的显式表达式。所以explicit operator bool
保护您免受隐式用户定义的转换,同时仍然允许语言定义的转换发生。
关于c++11 - 为什么隐式转换发生在 "if expression"虽然它应该是显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18303568/
我是一名优秀的程序员,十分优秀!