在int32_t上调用析构函数是否合法?

时间:2015-12-22 21:30:30

标签: c++ destructor

我刚刚发现以下代码不是有效的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所需的编译器?

1 个答案:

答案 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();