【问题标题】:Incompatibilities between safe bool idiom and explicit operator bool安全布尔成语和显式运算符布尔之间的不兼容性
【发布时间】:2012-02-21 18:45:06
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我已经注意到我使用的指针类型不是最好的类型,它可以很好地作为示例,因为这与正确实现之间的差异与我的答案无关,这是更具可读性。
    【解决方案2】:

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

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

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

    【讨论】:

    • 当然你是对的。但我用language-lawyer 标记它是有原因的。我想要从标准本身得出的纯粹事实,而不是关于良好实践的建议。必须澄清这一点,但无论如何谢谢。
    • @Fanael:标准,C++03 和 C++11 都没有谈论安全布尔成语,所以不可能引用它来支持我所说的。我所暗示的只是 C++11 出于某种原因引入了explicit operator bool,我认为其中一个原因是explicit operator bool 比所谓的安全更安全 -bool 成语。
    • 但是标准谈到了用于实现安全布尔成语的东西。因此,虽然该标准没有提及该习语本身,但文档中几乎暗示了它的确切保证。
    • @Fanael:我添加了一些东西来回答。
    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 2011-09-27
    • 2011-03-27
    • 2010-09-23
    • 2015-08-22
    相关资源
    最近更新 更多