安全布尔习语在 C + + 11中过时了吗?

@ R 的回答。Martinho Fernandes 显示,safe-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 所说的“隐式显式转换”(在标准中称为“上下文转换”)。

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

  • 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)

我们在标题中的假设正确吗? 我希望我们没有忽略任何潜在的缺点。

20640 次浏览

是的。这是 的例子,只有隐式的用户定义转换和显式的用户定义转换操作符实际上是 因为这个问题而发明的,并取代所有的安全布尔的东西与一些更干净和更合乎逻辑的问题。

我不会说它“过时”。到目前为止,并不是每个人都在跨越到 C + + 11(甚至还没有到 一年的年龄)。即使有大量的编码人员,保持代码向后兼容的能力也是必须的,因为这种习惯用法对于库而言似乎比对于程序本身更为合理。