@R. Martinho Fernandes的回答表明,安全bool习惯用法在C++11中已经被弃用,因为它可以被一个简单的
explicit operator bool() const;
根据答案中的标准引用§4 [conv] p3:
如果存在一个发明的临时变量t(§8.5),使得声明T t = e;是良好形式的,则表达式e可以被隐式转换为类型T。某些语言结构要求将表达式转换为布尔值。在这种上下文中出现的表达式e被称为“上下文转换”为bool,并且仅当声明bool t(e);对于某个发明的临时变量t(§8.5)形成良好形式时,它才是良好形式的。
突出显示的部分清楚地显示了“隐式显式转换”(在标准中称为“上下文转换”),如@R. Martinho所说。
需要“隐式显式转换”的“某些语言结构”似乎是以下内容:
- if, while, for(§6.4 [stmt.select] p4) - 二元逻辑运算符&&和||(§5.14 [expr.log.and/or] p1,两者都是) - 逻辑否定运算符!(§5.3.1 [expr.unary.op] p9) - 条件运算符?:(§5.14 [expr.cond] p1) - static_assert(§7 [dcl.dcl] p4) - noexcept(§15.4 [except.spec] p2)
我们在标题中的假设是正确的吗?我希望我们没有忽略任何潜在的缺点。
operator bool
中返回值。例如,如果我有一个名为 p 的shared_ptr
成员,并且有这个方法:operator bool() const { return p; }
,它将无法编译。在我看来,这很愚蠢。 - David