在C ++ 11中,安全布尔成语是否过时?
@R的这个答案。 马丁·费尔南德斯(Martinho Fernandes)表示,安全布尔成语在C ++ 11中被明显弃用,因为它可以被简单的
explicit operator bool() const;
根据答案§4 [conv] p3
的标准报价:
一个expression式e可以被隐含地转换为一个types
T
当且仅当声明T t=e;
对于一些发明的临时variablest
(§8.5)来说,是格式良好的。 某些语言结构要求将expression式转换为布尔值。 出现在这样的语境中的expression式e
据说被上下文转换为bool
, 并且当且仅当声明bool t(e);
对于一些发明的临时variablest(§8.5)来说, 是格式良好的 。
突出显示的部分清楚地显示了“隐式显式强制转换”(在标准中称为“上下文转换”)为@R。 马蒂尼说的。
需要“隐式显式投射”的“某些语言结构”似乎是:
-
if
,while
,(§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岁)迈进。 而且,即使有大量的编码者,保持代码向后兼容的能力也是必须的,考虑到这种成语对于图书馆来说似乎比对程序本身更合理。