安全布尔成语在 C++11 中过时了吗?

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

提问人:Xeo 提问时间:6/5/2011 最后编辑:CommunityXeo 更新时间:12/23/2011 访问量:21214

问:

马蒂尼奥·费尔南德斯@R的这个回答表明,safe-bool 成语在 C++11 中被弃用,因为它可以被一个简单的

explicit operator bool() const;

根据答案中的标准引号:§4 [conv] p3

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

突出显示的部分清楚地显示了 @R. Martinho 所说的“隐式显式转换”(在标准中称为“上下文转换”)。

需要“隐式显式强制转换”的“某些语言结构”似乎如下:

  • if, ,whilefor (§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)

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

C ++11 已弃用 C++-FAQ safe-bool-idiom

评论

31赞 Björn Pollex 6/26/2011
+1:我喜欢这种类型的问题,它教会了我关于即将到来的标准的新知识。
1赞 David 3/3/2016
你知道标准中缺少什么隐式显式强制转换......从另一个返回一些东西.例如,如果我有一个名为 p 的成员并具有以下方法: ,则编译失败。那是愚蠢的IMO。operator boolshared_ptroperator bool() const { return p; }
0赞 Sz. 8/3/2019
@David,你说的“隐式显式”演员表是什么意思?

答:

135赞 Puppy 6/5/2011 #1

是的。这是仅具有隐式用户定义转换的问题示例,并且由于这个问题实际上发明了显式用户定义的转换运算符,并用更干净、更合乎逻辑的东西替换了所有安全布尔的东西。

-6赞 Luis Machuca 12/19/2011 #2

我不会称它为“过时”。并不是每个人都在向C++11(甚至不到1岁)迈出这一步。即使有大量的编码人员,保持代码向后兼容的能力也是必须的,因为这种习语对于库来说似乎比对程序本身更明智。

评论

35赞 Xeo 12/19/2011
我纯粹是在 C++11 面前说话。这个问题既没有涉及旧代码,也没有向后兼容性,也没有涉及不愿意更改为C++11感知编译器的问题。另请注意,C++11本身并不完全向后兼容,它引入了重大更改。
4赞 Luis Machuca 12/23/2011
对不起,不可能知道这一点。我不仅考虑了一开始链接的答案,还考虑了问题被标记为 [c++] 和 [c++-faq] 的事实,这让我认为对语言的两个阶段的评估是相关的。
1赞 Xeo 12/23/2011
不过你肯定是对的,我没有在问题中明确说明。我会编辑它,谢谢你的提醒。
1赞 Puppy 10/25/2013
这个答案真的可以使用更新,现在它已经快两年了。
1赞 HostileFork says dont trust SE 12/6/2014
由于意见分歧,我将不得不投反对票,尽管我会亲自给你买一杯啤酒,然后说“嘿,没有难受的感觉”。但是 C++11 中的许多范式早在最后一颗钉子被钉入标准棺材之前就已经进行了部署,他们决定将这个名字放在 ISO 规范上。除非你是一个非常深入的模板元编程迷,否则 C++11 规范的细节与人们使用的内容对你来说可能无关紧要......这意味着即使在那时,它也比 2011 年更古老,几乎所有的实际用途也是如此。现在,按照我的时钟,已经快到2015年了。--std=c++0x