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