Рассмотрим следующий код:
#include <iostream>
typedef int t;
t a=42;
int main()
{
a.t::~t();
std::cout << a; //42
}
Я ожидал что a
будет уничтожен Но это не правда, почему? Как этот псевдодеструкторный вызов уничтожит объект?
Но это не правда, почему?
§5.2.4 / 1:
Единственный эффект является оценкой выражения postfix перед точкой или стрелкой.
Где постфиксное выражение — это выражение объекта, для которого происходит вызов. Таким образом, вызов псевдо-деструктора, как и вызов тривиального деструктора, не заканчивает время жизни объекта, к которому он применяется. Например,
int i = 0;
(i += 5).~decltype(i)();
std::cout << i;
Вы не можете вызвать деструктор для скаляров, потому что у них его нет (см. [Class.dtor]). Это утверждение допустимо только для кода шаблона, в котором вы вызываете деструктор объекта, тип которого вы не знаете, — это устраняет необходимость написания специализации для скалярных типов.
В комментариях было отмечено, что [expr.pseudo] подразумевает существование деструктора для скаляров
Использование -Деструктор имя-псевдо после точки
.
или стрелка->
оператор
представляет деструктор для неклассного типа, названного Имя-типа.
Однако это не согласуется с другими частями стандарта, например, §12, который называет деструктор специальной функцией-членом и упоминает, что
Деструктор используется для уничтожения объектов своего типа.
Похоже, неточность, созданная в C ++ 98 дней.