在C ++ 11中,安全布尔成语是否过时?

@R的这个答案。 马丁·费尔南德斯(Martinho Fernandes)表示,安全布尔成语在C ++ 11中被明显弃用,因为它可以被简单的

explicit operator bool() const; 

根据答案§4 [conv] p3的标准报价:

一个expression式e可以被隐含地转换为一个typesT当且仅当声明T t=e; 对于一些发明的临时variablest (§8.5)来说,是格式良好的。 某些语言结构要求将expression式转换为布尔值。 出现在这样的语境中的expression式e据说被上下文转换bool并且当且仅当声明bool t(e); 对于一些发明的临时variablest(§8.5)来说, 是格式良好的

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

需要“隐式显式投射”的“某些语言结构”似乎是:

  • ifwhile ,( §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

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

是。 这是仅有隐含的用户定义转换的问题例子, 由于这个问题 ,显式的用户定义的转换操作符实际上已经被发明出来,并且用更清洁和更合理的东西来replace所有安全布尔的东西。

我不会称之为“过时”。 到目前为止,并不是每个人都在向C ++ 11(甚至不到1岁)迈进。 而且,即使有大量的编码者,保持代码向后兼容的能力也是必须的,考虑到这种成语对于图书馆来说似乎比对程序本身更合理。