安全布尔习惯用法在C++11中已经过时了吗

Is the safe-bool idiom obsolete in C++11?

本文关键字:过时 布尔习 惯用法 C++11 安全      更新时间:2023-10-16

@R的这个答案。Martinho Fernandes表明,安全bool习惯用法在C++11中明显被弃用,因为它可以被简单的取代

explicit operator bool() const;

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

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

突出显示的部分清楚地显示了@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

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

是。这是仅具有隐式用户定义转换的问题的例子,而显式用户定义的转换运算符实际上是因为这个问题而发明的,并用更干净、更合乎逻辑的东西取代所有安全的bool东西。

我不会称之为"过时"。到目前为止,并不是每个人都在向C++11迈进(甚至不是一年前的版本)。即使有大量的程序员,保持代码向后兼容的能力也是必须的,考虑到这种习惯用法对库来说似乎比对程序本身来说更明智。