这是运算符别名吗?

Is this operator aliasing?

本文关键字:别名 运算符      更新时间:2023-10-16

我不明白typedef void (Testable::*bool_type)() const;是什么意思适用于operator

是这样的代码

class Testable {
    typedef void (Testable::*bool_type)() const;
public:
    operator bool_type() const {
     ...
    }
};

相当于

class Testable {
public:
    void operator ()() const {
     ...
    }
};

class Testable {
    typedef void (Testable::*bool_type)() const;
public:
    operator bool_type() const {
     ...
    }
};

...定义了对bool_type的隐式转换,这是一个指向成员类型的不可访问的指针。

这是一种 C++03 技术,用于提供对bool的隐式转换,同时避免意外的隐式转换,特别是对于函数调用重载解析。返回的成员指针转换为 bool,但不转换为可以想象用于函数参数的任何类型。相比之下,纯bool结果将转换为例如 int ,并且 C++03 个 iostreams 使用的void*结果将与void*正式的参数相匹配。

对于 C++11 及更高版本,您将改为使用 explicit ,如下所示:

explicit operator bool() const { return whatever; }

但更好的是,定义一个命名转换函数,例如

auto is_empty() const -> bool { return whatever; }

这在C++03中通常也更好。


关于"这样的代码是否等同于......",不,不是。