@R的答案。Martinho Fernandes表明,C ++ 11中不赞成使用安全布尔习语,因为可以用一个简单的方法代替它
explicit operator bool() const;
根据答案中的标准报价§4 [conv] p3
:
T
当且仅当声明T t=e;
的格式正确(对于某些发明的临时变量t
(第8.5节))时,表达式e才能隐式转换为类型。某些语言构造要求将表达式转换为布尔值。表达式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
)
我们标题中的假设正确吗?我希望我们不要忽视任何潜在的缺点。
30
+1:我喜欢这种类型的问题,可以教我有关即将到来的标准的新知识。
—
比约恩博动
您知道标准中缺少什么隐式显式强制转换...从另一个返回某些内容
—
David
operator bool
。例如,如果我有一个shared_ptr
名为p 的成员并具有以下方法:operator bool() const { return p; }
,则它将无法编译。那真是愚蠢的海事组织。
@David,“隐式显式”强制转换是什么意思?
—
Sz。