Вызов псевдо-деструктора не уничтожает объект

Рассмотрим следующий код:

#include <iostream>

typedef int t;
t a=42;

int main()
{
a.t::~t();
std::cout << a; //42
}

Я ожидал что a будет уничтожен Но это не правда, почему? Как этот псевдодеструкторный вызов уничтожит объект?

9

Решение

Но это не правда, почему?

§5.2.4 / 1:

Единственный эффект является оценкой выражения postfix перед точкой или стрелкой.

Где постфиксное выражение — это выражение объекта, для которого происходит вызов. Таким образом, вызов псевдо-деструктора, как и вызов тривиального деструктора, не заканчивает время жизни объекта, к которому он применяется. Например,

int i = 0;
(i += 5).~decltype(i)();
std::cout << i;

Вы не можете вызвать деструктор для скаляров, потому что у них его нет (см. [Class.dtor]). Это утверждение допустимо только для кода шаблона, в котором вы вызываете деструктор объекта, тип которого вы не знаете, — это устраняет необходимость написания специализации для скалярных типов.


В комментариях было отмечено, что [expr.pseudo] подразумевает существование деструктора для скаляров

Использование -Деструктор имя-псевдо после точки . или стрелка -> оператор
представляет деструктор для неклассного типа, названного Имя-типа.

Однако это не согласуется с другими частями стандарта, например, §12, который называет деструктор специальной функцией-членом и упоминает, что

Деструктор используется для уничтожения объектов своего типа.

Похоже, неточность, созданная в C ++ 98 дней.

24

Другие решения


По вопросам рекламы [email protected]