183

@R的这个答案。Martinho Fernandes表明,safe-bool 习惯用法在 C++11 中显然已被弃用,因为它可以被一个简单的替换

explicit operator bool() const;

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

对于某些发明的临时变量(第 8.5 节) ,T当且仅当声明格式正确时,表达式 e 才能隐式转换为类型。某些语言结构要求将表达式转换为布尔值。对于某些发明的临时变量 t(第 8.5 节),当且仅当声明格式正确时,出现这种上下文中的表达式被称为上下文转换为格式正确。T t=e;teboolbool t(e);

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

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

  • if, while, for( §6.4 [stmt.select] p4)
  • 二元逻辑运算符&&and ||(§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)

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

4

2 回答 2

131

是的。这是仅具有隐式用户定义转换和显式用户定义转换运算符的问题的示例,实际上是因为这个问题而发明的,并用更清洁和更合乎逻辑的东西替换所有安全布尔的东西。

于 2011-06-05T12:03:46.730 回答
-6

我不会称它为“过时的”。到目前为止,并不是每个人都在跳到 C++11(甚至不到1岁)。即使有大量的编码人员,保持代码向后兼容的能力也是必须的,考虑到这种习语对于库来说似乎比对程序本身更明智。

于 2011-12-18T19:32:08.687 回答