7

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

因此,从旧的和沉闷的安全 bool 成语切换到新的和闪亮的,可能导致的所有explicit operator bool可能的不兼容(即使是最微小的不兼容)是什么?

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

4

2 回答 2

4

如果您在代码中错误地使用了安全布尔转换,那么只有这样explicit operator bool才会不兼容,因为它不允许您那么容易地错误地做事。否则,它应该没有任何问题。事实上,即使有问题,你仍然应该切换到explicit operator bool,因为如果你这样做,那么你可以在安全布尔转换的使用中发现问题。

根据这篇文章,一些编译器使用成员函数指针为安全布尔实现发出低效指令,

当人们开始使用这个习语时,人们发现某些编译器会降低效率——成员函数指针导致编译器头痛,导致在获取地址时执行速度变慢。尽管差异很小,但当前的做法通常是使用成员数据指针而不是成员函数指针。

于 2012-02-21T18:52:36.117 回答
4

可能最大的区别是,假设您的代码没有错误(我知道,这不是一个安全的假设),在某些情况下,您可能希望隐式转换为完全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 */
}
于 2012-02-21T18:56:58.223 回答