有人指出我是“安全布尔习语”,然后尝试解释发生了什么(解释supplied on the site不足以使我理解它的工作原理),我决定尝试将以下代码分开并尝试尽可能简化它。该站点提供了以下代码:

class Testable {
    bool ok_;
    typedef void (Testable::*bool_type)() const;
    void this_type_does_not_support_comparisons() const {}
  public:
    explicit Testable(bool b=true):ok_(b) {}

    operator bool_type() const {
      return ok_==true ?
        &Testable::this_type_does_not_support_comparisons : 0;
    }
  };


我决定分析'bool_type'的关键基础,因为这似乎是它的重点。给出以下行:

typedef void (Testable::*bool_type)() const;


一个人可以(由于括号而不太容易)推断出它是一种类型为'void Testable :: *'的typedef,其中bool_type表示该类型定义。通过进行以下修改和函数调用,可以进一步证明这一点:

class Testable {
    bool ok_;
    typedef void (Testable::*bool_type)() const;
    void this_type_does_not_support_comparisons() const {}
  public:
    explicit Testable(bool b=true):ok_(b) {}

    bool_type Test; //Added this

    operator bool_type() const {
      return ok_==true ?
        &Testable::this_type_does_not_support_comparisons : 0;
    }
  };

int main()
{
    Testable Test;
    int A = Test.Test; //Compiler will give a conversion error, telling us what type .Test is in the process
}


它使我们可以看到bool_type是什么类型:


  错误:初始化时无法将'void(Testable :: *)()const'转换为'int'


这表明它确实是'void(Testable :: *)'的类型。

问题出现在这里:

如果我们修改以下功能:

    operator bool_type() const {
      return ok_==true ?
        &Testable::this_type_does_not_support_comparisons : 0;
    }


并将其转换为:

    operator void Testable::* () const //Same as bool_type, right?
    {
      return ok_==true ?
        &Testable::this_type_does_not_support_comparisons : 0;
    }


它产生以下投诉:


  错误:“ *”令牌之前的预期标识符
  错误:“ ”声明为返回函数的函数


因此,我的问题是:

如果'void(Testable :: *)确实是bool_type的typedef,为什么会引起这些抱怨?



这里发生了什么?

最佳答案

您的推理在这里出错

operator void Testable::* () const //Same as bool_type, right?


这是不对的。正如编译器在错误消息中告诉我们的那样,bool_type的类型是:


  '无效(Testable :: *)()const'


因此,要在运算符中替换它,您将需要

operator (void (Testable::*)() const) () const


如果有可能的话!看看为什么连丑陋的typedef也有所改进?

在C ++ 11中,我们还有新的构造explicit operator bool()可以使我们免于这种丑陋。

09-03 22:06