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


179

@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。马丁尼奥说。

要求“隐式显式强制转换”的“某些语言构造”如下所示:

  • ifwhilefor§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:我喜欢这种类型的问题,可以教我有关即将到来的标准的新知识。
比约恩博动

1
您知道标准中缺少什么隐式显式强制转换...从另一个返回某些内容operator bool。例如,如果我有一个shared_ptr名为p 的成员并具有以下方法:operator bool() const { return p; },则它将无法编译。那真是愚蠢的海事组织。
David

@David,“隐式显式”强制转换是什么意思?
Sz。

Answers:


128

是。这是一个示例的例子,由于这个问题,实际上只有隐式用户定义的转换而显式用户定义的转换运算符才被发明出来,并且用更干净,更合乎逻辑的东西代替了所有安全布尔值。


-5

我不会称其为“过时”。到目前为止,并不是每个人都在迈向C ++ 11(甚至不到1岁)。而且即使有大量的编码人员,也必须具有使代码向后兼容的能力,因为考虑到这种习惯用法对于库而言比对适当程序而言更为明智。


34
我纯粹是在C ++ 11的存在下谈论。这个问题既不涉及旧代码,也不具有向后兼容性,也不愿意更改为支持C ++ 11的编译器。还要注意,C ++ 11本身并不完全向后兼容,它引入了重大变化。
Xeo

4
抱歉,还无法知道。我不仅考虑开头的答案,还考虑了该问题被标记为[c ++]和[c ++-faq]的事实,这使我认为对语言的两个阶段进行评估都是相关的。
路易斯·马丘卡

1
不过您当然是对的,我没有在问题中明确指出。我将对其进行编辑,谢谢您的注意。
Xeo

1
这个答案已经使用了将近两年了,它真的可以使用更新了。
2013年

1
由于意见分歧,我将不得不投票,尽管我会亲自给您买啤酒并说“嘿,别难过”。但是C ++ 11中的许​​多范例都在经历部署,--std=c++0x直到最终钉子钉入标准棺材的时间很久,他们才决定将名称放到ISO规范中。除非您是真正的模板元编程迷,否则C ++ 11规范与人们使用的内容的细节可能对您没有影响……这意味着即使在那时,它在几乎所有实际用途上都早于2011年。而现在,按我的时钟说,已经
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.