【发布时间】:2011-09-08 17:22:05
【问题描述】:
This answer of @R. Martinho Fernandes 表明,安全布尔成语在 C++11 中已被弃用,因为它可以被简单的替换
explicit operator bool() const;
根据答案§4 [conv] p3中的标准引用:
表达式 e 可以隐式转换为类型
T当且仅当声明T t=e;格式正确,对于某些发明的临时变量t(第 8.5 节)。某些语言结构要求将表达式转换为布尔值。出现在这种上下文中的表达式e被称为上下文转换 到bool并且当且仅当声明bool t(e);格式正确时才格式正确,对于一些发明的临时变量 t(第 8.5 节)。
突出显示的部分清楚地将“隐式显式转换”(在标准中称为“上下文转换”)显示为@R。马蒂尼奥说的。
需要“隐式显式转换”的“某些语言结构”似乎如下:
-
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)
我们在标题中的假设是否正确?我希望我们没有忽略任何潜在的缺点。
【问题讨论】:
-
+1:我喜欢这种类型的问题,它教会了我关于即将出台的标准的新知识。
-
您知道标准中缺少什么隐式显式转换...从另一个
operator bool返回一些东西。例如,如果我有一个名为 p 的shared_ptr成员并具有此方法:operator bool() const { return p; },则编译失败。这是愚蠢的国际海事组织。 -
你所说的“隐式显式”演员是什么意思,@David?
标签: c++ c++11 deprecated c++-faq safe-bool-idiom