在int32\t上调用析构函数合法吗? < >我发现下面的代码不是一个有效的C++(它在 ~ >之后不解析 int /代码>:

在int32\t上调用析构函数合法吗? < >我发现下面的代码不是一个有效的C++(它在 ~ >之后不解析 int /代码>:,c++,destructor,C++,Destructor,但是,以下代码段确实有效: int32_t x=5; x、 ~int32_t(); 这是因为 It3xt t//Cuth>是我的C++实现中的 TyPulf,并且析构函数可以在任何类型的Debug中调用。 我的问题是:C++允许实现第二个剪辑编译吗?特别是,int32_t是否保证是一个typedef,如果编译器知道typedef typedef要int,是否需要允许销毁typedef?有一个明确的要求,int32_t是一个typedef。我们从[cstdint.syn]/2开始: 标题定义了与

但是,以下代码段确实有效:

int32_t x=5;
x、 ~int32_t();

这是因为 It3xt t//Cuth>是我的C++实现中的 TyPulf,并且析构函数可以在任何类型的Debug中调用。


我的问题是:C++允许实现第二个剪辑编译吗?特别是,
int32_t
是否保证是一个typedef,如果编译器知道typedef typedef要int,是否需要允许销毁typedef?

有一个明确的要求,
int32_t
是一个typedef。我们从[cstdint.syn]/2开始:

标题定义了与C标准中7.18相同的所有函数、类型和宏

因此,我们从这里了解对C库的需求:

typedef nameintN_t指定宽度为N的有符号整数类型,无填充位,并使用2的补码表示

[重点补充]

因此,是的,
int32\t
必须是一个“typedef名称”

尽管(据我所知)在规范性文本中从未直接说明,但下面的注释清楚地表明,为解析为内置类型的typedef调用析构函数是为了编译并成功([class.dtor]/16):

注意:析构函数的显式调用表示法可用于任何标量类型名称(5.2.4)。允许这样做,就可以编写代码,而不必知道给定类型是否存在析构函数。比如说,


int32_t
不是内置类型,不允许是宏。@Cheers和Hth.-Alf C++14标准草稿状态
typedef有符号整数类型int32_t
作为
int32\t
的定义。据我所知,这并没有为用户定义的类型和全部甚至一个宏留下太多空间。为了避免一场封闭式问题/开放式问题之战,我不打算投票以重复的方式结束,但是。。。这是链接问题的副本。仅仅因为另一个问题没有提到
int32\t
,并不意味着另一个问题没有回答你的问题。@DavidHammen,我现在失去了链接,但是那里的答案解释了它为什么适用于模板参数。这并不意味着同样的方法也适用于typedef,或者int32_t必须是typedef。因此,从技术上讲,它既没有回答我的具体问题,也没有回答我的具体问题。或者标准是否保证在原语上使用这种语法是不可操作的,并且成员访问从未真正发生过?@BenVoigt:好问题。我认为指针实际上不应该被取消引用,但我不确定我是否能找到一个肯定的说法。“唯一的影响是在点或箭头之前对post fix表达式进行求值。”(5.2.4)因此
(*p)。I:~I()
不好,但
p->I:~I()
好?实际上什么类型并不重要?似乎是一个缺陷。我能想到的显式调用析构函数的唯一用例是对由
placement new
构建的东西进行析构函数,因为销毁和释放需要单独完成。由于PODs除了释放内存外,在销毁时不会真正执行任何操作,因此显式调用PODs上的析构函数应该是NOP。@user3528438:这不是唯一的用例。另一个是在联合的元素之间切换(现在联合中可以有非平凡类型)。
int x = 5;
x.~int();
typedef int I;
I* p;
p->I::~I();