类型定义函数别名的析构函数

2022-05-19 00:00:00 destructor language-lawyer c++ typedef
#include <iostream>

struct A { ~A(); };
A::~A() {
    std::cout << "Destructor was called!" << std::endl;
}

typedef A AB;
int main() {
    AB x;
    x.AB::~AB(); // Why does this work?
    x.AB::~A();
}

上述程序的输出为:

Destructor was called!
Destructor was called!
Destructor was called!

我假设前两行属于用户析构函数调用,而第三行是由于析构函数在退出main函数的作用域时被调用。

根据我的理解,tyecif是一个类型的别名。在本例中,ABA的别名。

为什么这也适用于析构函数的名称?非常感谢您参考该语言规范。

编辑:这是在MacOS High Sierra版本10.13.3上使用Apple LLVM版本9.1.0(clang-902.0.39.1)编译的。


解决方案

为什么这也适用于析构函数的名称?

因为标准是:

[类.dtor]

在显式析构函数调用中,析构函数由后跟类型名称或dectype说明符的~指定 这表示析构函数的类类型。...

tyecif别名是一个类型名,它表示与类本身的类型名相同的类。

该规则甚至有一个清楚的例子:

struct B {
  virtual ~B() { }
};
struct D : B {
  ~D() { }
};

D D_object;
typedef B B_alias;
B* B_ptr = &D_object;

void f() {
  D_object.B::~B();             // calls B's destructor
  B_ptr->~B();                  // calls D's destructor
  B_ptr->~B_alias();            // calls D's destructor
  B_ptr->B_alias::~B();         // calls B's destructor
  B_ptr->B_alias::~B_alias();   // calls B's destructor
}

有关名称查找的进一步说明,以及适用于以下问题的示例:

[basic.lookup.qual]

如果伪析构函数名称([Expr.Poso])包含 嵌套名称说明符,则将类型名称作为 由嵌套名称说明符指定的范围。类似地,在 表单的限定ID:

嵌套名称指定类名称::~类名称

在与第一个类名相同的作用域中查找第二个类名。 [?示例:

struct C {
  typedef int I;
};
typedef int I1, I2;
extern int* p;
extern int* q;
p->C::I::~I();      // I is looked up in the scope of C
q->I1::~I2();       // I2 is looked up in the scope of the postfix-expression

struct A {
  ~A();
};
typedef A AB;
int main() {
  AB* p;
  p->AB::~AB();     // explicitly calls the destructor for A
}

-?结束示例?]

相关文章