安全bool习语和显式操作符bool之间的不兼容性

时间:2012-02-21 18:45:07

标签: c++ c++11 language-lawyer safe-bool-idiom

我正在考虑在已经使用C ++ 11功能的代码中用explicit operator bool替换所有安全bool习语的实例(因此旧编译器不识别显式转换运算符的事实并不重要) ,所以我想知道它是否会引起一些微妙的问题。

因此,所有是什么可能的不相容性(即使是最微小的)也可能是由旧的和沉闷的安全bool习语转换为新的闪亮的explicit operator bool

编辑:我知道切换是一个好主意,因为后者是一种语言功能,编译器很好理解,所以它的工作并不比实际上只是一个黑客更糟糕。我只是想知道可能的差异。

2 个答案:

答案 0 :(得分:4)

假设您的代码没有错误(我知道,不是一个安全的假设),可能最大的区别在于,在某些情况下,您可能希望隐式转换为boolexplicit转化功能不匹配。

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 */
}

答案 1 :(得分:3)

如果您在代码中错误地使用了safe-bool转换,则只有explicit operator bool不兼容,因为它不允许您轻松地做错误的操作。否则,它应该没问题。事实上,即使出现问题,您仍应切换到explicit operator bool,因为如果您这样做,那么您可以确定使用safe-bool转换时的问题。

根据this article,一些编译器使用成员函数指针发出低效的安全bool实现指令,

  

当人们开始使用这个习惯用法时,发现某些编译器存在效率损失 - 成员函数指针导致编译器头痛,导致获取地址时执行速度变慢。虽然差别很小,但目前的做法通常是使用成员数据指针而不是成员函数指针。