Можно ли вызвать деструктор на int32_t?

Я только выяснил, что следующий код не является допустимым С++ (он не анализируется при int после ~):

int x = 5;
x.~int();

Однако работает следующий фрагмент:

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

Это потому, что int32_t является typedef в моей конкретной реализации С++, и деструктор, по-видимому, может быть вызван любым типептическим типом.

Мой вопрос: является ли любая реализация С++ необходимой для компиляции второго файла? В частности, гарантируется, что int32_t является typedef, и компилятор должен разрешить уничтожение typedef, если он знает, что typedef typedefs что-то для int?

Ответ 1

Существует четкое требование, чтобы int32_t было typedef. Начнем с [cstdint.syn]/2:

Заголовок определяет все функции, типы и макросы так же, как 7.18 в стандарте C.

Итак, оттуда мы рассмотрим требование для библиотеки C:

имя typedef. intN_t обозначает целочисленный тип со знаком с шириной N, без битов дополнения и представления с двумя плюсами.

[выделено курсивом]

Итак, да, int32_t должно быть "typedef name".

Хотя (насколько я знаю) он никогда не указывался непосредственно в нормативном тексте, в следующем примечании ясно, что вызов деструктора для typedef, который разрешает встроенный тип, предназначен для компиляции и успешности ([class. dtor]/16):

Примечание. Обозначение для явного вызова деструктора может использоваться для любого имени скалярного типа (5.2.4). Это позволяет писать код, не зная, существует ли деструктор для данного типа. Например,

typedef int I;
I* p;
p->I::~I();