C ++ 11中的safe-bool成语是否过时?

时间:2011-06-05 12:01:56

标签: c++ c++11 deprecated c++-faq safe-bool-idiom

This answer of @R. Martinho Fernandes表明,在C ++ 11中显然已经弃用了safe-bool习语,因为它可以被简单的

取代
explicit operator bool() const;

根据答案§4 [conv] p3中的标准引用:

  

当且仅当声明T格式正确时,对于某些发明的临时变量T t=e;(§8.5),表达式e可以隐式转换为类型t。某些语言结构要求将表达式转换为布尔值。在这样的上下文中出现的表达式e被称为从上下文转换bool,并且格式正确,当且仅当声明bool t(e);对于一些发明的临时变量t(§8.5),它是格式良好的

突出显示的部分清楚地显示了“隐式显式转换”(在标准中称为“上下文转换”)为@R。马蒂纽提出来了。

需要“隐式显式强制转换”的“某些语言结构”似乎如下:

  • ifwhilefor§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

我们在标题中的假设是否正确?我希望我们不会忽视任何潜在的缺点。

2 个答案:

答案 0 :(得分:123)

是。这是示例,用于仅具有隐式用户定义转换的问题,显式的用户定义转换运算符实际上是invented because of this problem并且用更清洁的东西替换所有安全bool的东西更符合逻辑。

答案 1 :(得分:-2)

我不会称之为“过时”。不是每个人都在迈向C ++ 11(甚至还不是 1年>)。即使编写了大量的编码器,保持代码向后兼容的能力也是必须的,考虑到这种习惯对于图书馆而言比对于正确的程序更合理。