2012-02-21 75 views
7

我正在考虑在已经使用C++ 11功能的代码中将安全布尔成语的所有实例替换为explicit operator bool(因此旧版编译器无法识别显式转换操作员无所谓),所以我想知道它是否会导致一些微妙的问题。安全布尔成语与显式运算符之间的不兼容bool

因此,什么是所有可以通过从陈旧,失去光泽安全布尔成语切换到新的和有光泽explicit operator bool将可能造成的不兼容问题(哪怕是最微小的)?

编辑:我知道,无论如何,切换是一个好主意,因为后者是一种语言特性,编译器很好理解,所以它不会比事实上只是一个黑客更糟。我只是想知道可能的差异。

回答

3

如果您在代码中使用了safe-bool转换不正确,那么只有explicit operator bool是不兼容的,因为它不允许您轻松地做错事情。否则,应该没问题。实际上,即使存在问题,您仍然应该切换到explicit operator bool,因为如果您这样做,那么您可以在使用安全布尔转换时识别问题。

根据this article,一些编译器发射使用成员函数指针,安全,布尔实施低效的指令,

当人们用这个成语开始,人们发现,有一些编译器的效率损失 - 的成员函数指针导致编译器头痛,导致地址被提取时执行速度较慢。尽管差异很小,但目前的做法通常是使用成员数据指针而不是成员函数指针。

+0

当然你是对的。但是我有一个原因,我用'language-lawyer'标记了这个。我希望标准本身遵循纯粹的事实,而不是对良好实践的建议。得澄清,但无论如何感谢。 – Fanael 2012-02-21 19:00:12

+0

@Fanael:标准,C++ 03和C++ 11都没有提到safe-bool习惯用法,所以不可能引用它来支持我所说的。我隐含的意思是C++ 11已经引入了“明确的操作符bool”,我认为其中一个原因是“显式操作符bool”比所谓的更安全**安全布尔成语。 – Nawaz 2012-02-21 19:06:35

+1

但是标准会谈到用于实现安全布尔成语的事情。所以,虽然这个标准对这个成语本身毫无用处,但它的确切保证几乎是文档隐含的。 – Fanael 2012-02-21 19:11:04

4

也许最大的区别,假设你的代码是免费的bug(我知道,不是一个安全的假设),将在某些情况下,你可能想的隐式转换正好bool。转换函数explicit不匹配。

struct S1 
{ 
    operator S1*() { return 0; } /* I know, not the best possible type */ 
} s1; 

struct S2 
{ 
    explicit operator bool() { return false; } 
} s2; 

void f() 
{ 
    bool b1 = s1; /* okay */ 
    bool b2 = s2; /* not okay */ 
} 
+2

这不是安全的布尔成语。 – Nawaz 2012-02-21 18:58:12

+4

我已经注意到我使用的指针类型不是最好的类型,它作为一个例子很好,因为这和正确的实现之间的差异与我的答案无关,而且这更易读。 – hvd 2012-02-21 19:00:53