我刚刚发现下面的代码是不是有效的C++(它不会在解析int
后~
):
int x = 5; x.~int();
但是,以下代码段确实有效:
int32_t x = 5;
x.~int32_t();
这是因为int32_t
是typedef
在我的特定实现C++的,和析构函数,显然,可以在任何Typedef的类型调用.
我的问题是:是否需要允许第二个剪切编译的C++的任何实现?特别是,int32_t
保证是一个typedef,并且如果它知道typedef typedef要int的话,是否允许销毁typedef所需的编译器?
有一个明确的要求int32_t
是typedef.我们从[cstdint.syn]/2开始:
标题定义了所有函数,类型和宏,与C标准中的7.18相同.
那么我们从那里看看C库的要求:
的typedef名 intN_t表示具有宽度N,没有填充比特,和一个二的补码表示的符号整数类型.
[强调补充]
所以是的,int32_t
必须是"typedef名称".
虽然(据我所知)它从未直接在规范性文本中声明,但以下注释清楚地表明,为解析为内置类型的typedef调用析构函数是为了编译并成功([class.dtor]/16):
注意:显式调用析构函数的表示法可用于任何标量类型名称(5.2.4).允许这样就可以编写代码而无需知道给定类型是否存在析构函数.例如,
typedef int I; I* p; p->I::~I();