C++ 安全bool习惯用法bool_类型(以及安全bool习惯用法)是如何工作的?

C++ 安全bool习惯用法bool_类型(以及安全bool习惯用法)是如何工作的?,c++,safe-bool-idiom,C++,Safe Bool Idiom,有人向我指出了“安全布尔成语”,在试图解释发生了什么(解释不足以让我理解它的工作原理)之后,我决定尝试拆分以下代码,并尽可能简化它。网站提供的代码如下: class Testable { bool ok_; typedef void (Testable::*bool_type)() const; void this_type_does_not_support_comparisons() const {} public: explicit Testable(bo

有人向我指出了“安全布尔成语”,在试图解释发生了什么(解释不足以让我理解它的工作原理)之后,我决定尝试拆分以下代码,并尽可能简化它。网站提供的代码如下:

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;
    }
  };
我决定分析“布尔鲁类型”的关键基础,因为这似乎是它的核心。给出以下行:

typedef void (Testable::*bool_type)() const;
人们可以(由于括号的缘故,不那么容易)推断出它是一种“void Testable::*”类型的typedef,bool_类型代表了这种类型。通过进行以下修改和函数调用,可以进一步证明这一点:

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
}
它可以让我们看到布尔_类型是什么:

错误:无法在初始化中将“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(可测试::*)确实是bool_类型的typedef,为什么会产生这些抱怨


这里发生了什么事?

你的推理在这里出错了

operator void Testable::* () const //Same as bool_type, right? 
这是不对的。正如编译器在错误消息中告诉我们的那样,bool_类型的类型是:

'无效(可测试::*)()常量'

所以,要在操作符中替换它,您需要

operator (void (Testable::*)() const) () const
如果有可能的话!看看为什么丑陋的typedef也是一种改进


在C++11中,我们还使用了新的构造
显式运算符bool()
,将我们从这种丑陋中解救出来。

为什么一个人在标题中提出一个问题,然后在文本中提出一个完全不同的问题?更不用说两个截然不同的问题了?问题是什么
bool_type
是指向成员函数的指针,指向类型为
void Testable::some_function()const
的函数。不存在“因为包围”而引起的混淆(尽管C++声明语法不是美的缩影)。我从来没有说过“混淆”这个词,我只是说它不容易推断(可测试::*BoLoLyType),乍一看,似乎是指向一个名为BooLyType变量的指针。除非它不是,因为typedef意味着在前面的所有内容之后使用的最后一个单词是typedef。即使它被括起来(这与优先级相反)。@Alf Point是,为什么bool_类型的替代品不起作用?而且,我看不出它与标题有什么不同(这里发生了什么?=安全bool成语如何工作?;为什么它会产生这些抱怨=bool_类型如何工作)。我认为你是在学究式的。@ SUMIT3:标题问题是一个反模式(使用Rube Gooer-Beg类似的技术来避免一个特定陷阱时使用邪恶的隐式转换),而文本中的问题只涉及C++语法。让我猜一下,显式只对布尔人有用吗?好主意。谢谢你回答这个问题。
s/回答这个问题/对这个问题做了一个很好的猜测/