提问人:Xeo 提问时间:6/5/2011 最后编辑:CommunityXeo 更新时间:12/23/2011 访问量:21214
安全布尔成语在 C++11 中过时了吗?
Is the safe-bool idiom obsolete in C++11?
问:
马蒂尼奥·费尔南德斯@R的这个回答表明,safe-bool 成语在 C++11 中被弃用,因为它可以被一个简单的
explicit operator bool() const;
根据答案中的标准引号:§4 [conv] p3
表达式 e 可以隐式转换为类型,当且仅当声明格式正确时,对于某些发明的临时变量 (§8.5)。某些语言构造要求将表达式转换为布尔值。在这种上下文中出现的表达式被称为上下文转换为并且格式正确,当且仅当声明
bool t(e);
对于某些发明的临时变量 t (§8.5),格式良好。T
T t=e;
t
e
bool
突出显示的部分清楚地显示了 @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
)
我们在标题中的假设正确吗?我希望我们没有忽视任何潜在的缺点。
答:
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
上一个:编译/链接过程如何工作?
下一个:C++ 中的多态性
评论
operator bool
shared_ptr
operator bool() const { return p; }