【问题标题】:Is the safe-bool idiom obsolete in C++11?C++11 中的安全布尔成语是否已过时?
【发布时间】: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


【解决方案1】:

是的。这是示例,仅具有隐式用户定义转换和显式用户定义转换运算符实际上是invented because of this problem 并用更清洁和更合乎逻辑的东西替换所有安全布尔的东西.

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我纯粹是在 C++11 面前说的。这个问题既不涉及旧代码、向后兼容性,也不涉及不愿意更改为支持 C++11 的编译器。另请注意,C++11 本身并不完全向后兼容,它引入了重大更改。
    • 无法知道这一点,抱歉。我不仅考虑了开头链接的答案,而且还考虑了问题被标记为 [c++] 和 [c++-faq] 的事实,这使我认为对 both 阶段的评估语言是相关的。
    • 您当然是对的,但我没有在问题中明确说明。我会编辑它,谢谢你的提醒。
    • 这个答案真的可以使用更新,因为它已经快两年了。
    • 由于意见不同,我将不得不投反对票,尽管我会亲自给你买杯啤酒并说“嘿,不要难受”。但是 C++11 中的许多范例早在最终钉子被钉入标准棺材之前就已被部署为 --std=c++0x,他们决定将名称放在 ISO 规范中。除非你是一个非常深入的模板元编程迷,否则 C++11 规范的细节与人们使用的内容可能对你没有任何影响……这意味着即使在那时,它也比 2011 年几乎所有实际用途都要早。现在,按我的时钟,已经快 2015 年了。
    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多