安全布尔习惯用法在C++11中已经过时了吗
Is the safe-bool idiom obsolete in C++11?
@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说的。
需要"隐式-显式转换"的"某些语言构造"似乎如下:
if
、while
、for
(§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迈进(甚至不是一年前的版本)。即使有大量的程序员,保持代码向后兼容的能力也是必须的,考虑到这种习惯用法对库来说似乎比对程序本身来说更明智。
相关文章:
- 一个关于在C++中重载布尔运算符的问题
- 提升精神:解析布尔表达式并简化为规范范式
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 线程之间的布尔停止信号
- 布尔比较运算符是如何在C++中工作的
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 隐式常量/非常量运算符布尔
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 如何在 c++ 中让布尔变量返回为 0 或 1 而不是真或假?
- 重载更少,则运算符返回相反的布尔值
- 将布尔变量添加到 int
- 为什么布尔开关语句有编译器警告?
- 将此布尔值传递给此函数的最有效方法是什么?
- 如何使布尔变量仅在设置为 true 时才为真?
- 为什么我不能在返回 const 的布尔函数中为类成员变量赋值?C++
- 程序中的布尔函数返回输入的范围无论如何都是无效的
- 当我尝试通过 arduino 上的引用传递布尔数组时出现问题
- 布尔表达式习语中的字符串文字是什么
- 安全布尔习惯用法在C++11中已经过时了吗