【问题标题】:Why is this operator called in C++?为什么在 C++ 中调用此运算符?
【发布时间】:2011-07-23 19:21:11
【问题描述】:

我不明白,为什么在倒数第二行调用了aaa操作符?

#include <iostream>

class MyClass
{
private:
    typedef void (MyClass::*aaa)() const;
    void ThisTypeDoesNotSupportComparisons() const {}
public:
    operator aaa() const { return (true) ? &MyClass::ThisTypeDoesNotSupportComparisons : 0; }
};

int main()
{
    MyClass a;
    MyClass b;

    if(a && b) {}
}

【问题讨论】:

  • 我觉得它像 VooDoo...

标签: c++ overloading operator-keyword


【解决方案1】:

编译器搜索 (a && b) 的最佳匹配。

由于该类没有将 MyClass 转换为布尔值的运算符,因此它会搜索最佳转换。

operator aaa() const 是对 aaa 类型指针的强制转换。指针可以在 if 语句中求值。

Overloading typecasts

Conversion Functions (C++)

【讨论】:

  • +1。你有它可以按顺序尝试的最佳匹配运算符列表吗?
  • 基元之间的隐式转换有一个默认层次结构。 (在网上很容易找到)。对于自定义类,我认为它是这样的:检查类->检查基类->检查最佳匹配转换(最短隐式转换路由/序列到所需类型)
  • 这就是隐式转换很危险的原因...所选的转换顺序不能保证,并且可能会丢失信息
【解决方案2】:

您的变量在表达式中使用。该类型本身没有为其定义运算符&&,但它可转换为可在表达式中使用的类型(指针)。所以调用了转换运算符。

【讨论】:

  • 那么这里发生了什么?它将类转换为ptr,然后将ptr转换为bool?我仍然需要澄清它为什么这样做,或者可能是运算符优先级列表(例如为什么用 bool 而不是 ! 而不是 int 而不是 void* 而不是 void class::* 而不是 ....)
  • 如果该类有一个 operator bool 将被使用。现在它没有了,所以另一种方法是使用一个用户定义的转换和一个隐式的指针到布尔转换。编译器一直这样做。这个指针是一个指向成员的指针,只是为了将可能的隐式转换限制为仅限于布尔值。
【解决方案3】:

它看起来像一个类型转换运算符。哎呀,没关系,误读了“为什么调用这个运算符”为“这个运算符叫什么”


好的,我测试了您的代码并进一步检查了它。所以运算符 aaa 是类型转换为 aaa 类型。 aaa 类型是指向 void func() 类型的 member 函数的指针。 ThisTypeDoesNotSupportComparisons 是 aaa 类型的函数。运算符 aaa 被调用并返回指向函数的指针。

我认为调用它是因为 if 也允许使用指向函数的指针。您可以测试一个指针是否为 NULL,这是编译器能找到的最接近的值,因此 if 调用运算符 aaa 并测试返回的指针是否为零。

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2010-10-24
    • 2016-06-01
    • 2019-07-04
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2021-07-03
    • 2019-06-05
    相关资源
    最近更新 更多