C++11中,安全的bool惯用法已经过时了吗?

185

@R. Martinho Fernandes的回答表明,安全bool习惯用法在C++11中已经被弃用,因为它可以被一个简单的

explicit operator bool() const;

根据答案中的标准引用§4 [conv] p3:
如果存在一个发明的临时变量t(§8.5),使得声明T t = e;是良好形式的,则表达式e可以被隐式转换为类型T。某些语言结构要求将表达式转换为布尔值。在这种上下文中出现的表达式e被称为“上下文转换”为bool,并且仅当声明bool t(e);对于某个发明的临时变量t(§8.5)形成良好形式时,它才是良好形式的。
突出显示的部分清楚地显示了“隐式显式转换”(在标准中称为“上下文转换”),如@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)
我们在标题中的假设是正确的吗?我希望我们没有忽略任何潜在的缺点。

31
我喜欢这种能让我学到有关未来标准的新知识的问题。 - Björn Pollex
1
你知道标准中缺少的隐式显式转换吗?它可以从另一个 operator bool 中返回值。例如,如果我有一个名为 p 的 shared_ptr 成员,并且有这个方法:operator bool() const { return p; },它将无法编译。在我看来,这很愚蠢。 - David
“implicit explicit”转换是什么意思,@David? - Sz.
2个回答

135

是的。这是仅具有隐式用户定义转换的问题的示例,而明确的用户定义转换运算符实际上是因为这个问题而被发明,并用更清洁和逻辑更强的东西来替代所有安全布尔值操作。


-6

我不会称它为“过时”。并不是每个人都在采用 C++11(甚至还不到1年)的新特性。即使有很多程序员在使用,考虑到这种习惯用法对于库而言似乎更加合理,因此保持代码向后兼容的能力也是必须的。


35
我只是在讨论C++11的情况下说话。这个问题既不涉及旧代码,也不涉及向后兼容性或不愿改用支持C++11的编译器。同时请注意,C++11本身并不完全向后兼容,它引入了破坏性的变化。 - Xeo
4
很抱歉,我之前不知道这个信息。我没有只考虑到一开始提供的答案,而且注意到这个问题被标记为[c++]和[c++-faq],这让我认为评估语言的两个阶段都是相关的。 - Luis Machuca
1
你说得没错,我在问题中没有明确说明。我会编辑一下,感谢提醒。 - Xeo
1
这个答案真的需要更新,因为它已经快两年了。 - Puppy
1
我很感兴趣。需要更新什么答案?虽然有些人已经认为甚至 C++11 都已经“陈旧”,但在任何生产系统中,我看到的“默认”发行版的默认编译器仍然将 C++03 视为默认模式。安全 bool 习惯用法在 C++03 中没有失败,对于它们来说仍然不会失败,并且在较新的操作模式下也不会失败。这个习惯用法本身并不会过时。最多,它的表达方式 会被隐藏 - Luis Machuca
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接