Я только что написал следующую программу, и она компилируется и работает нормально. (см. живую демонстрацию здесь)
#include <iostream>
typedef int T;
int main()
{
int a=3;
std::cout<<a<<'\n';
a.~T();
std::cout<<a;
return 0;
}
Почему программа компилируется нормально? Если я не ошибаюсь, у скалярных типов нет конструктора и деструктора в C++. Итак, хорошо ли определена эта программа? Уничтожает ли в этом случае явный вызов деструктора variable a
или он будет автоматически уничтожен компилятором по завершении выполнения функции? Я знаю, что доступ к объекту после окончания его жизни имеет неопределенное поведение в C++. Но что об этом говорит стандарт C++?
Я нашел немного похожий вопрос здесь на SO . Ответ, данный @Columbo, говорит, что:
Вы не можете вызвать деструктор для скалярных типов, потому что у них его нет. Этот оператор разрешен исключительно для кода шаблона, в котором вы вызываете деструктор объекта, тип которого вам неизвестен, — он устраняет необходимость написания специализации для скалярных (или даже массивных) типов.
Поэтому я не понимаю объяснения, данного им. Было бы лучше, если бы кто-то объяснил это с помощью шаблонного кода, в котором вызывается деструктор объекта, тип которого неизвестен. Буду признателен, если кто-нибудь объяснит это на простом примере.
typedef
)? И g++, и clang++ не жалуются... - person vsoftco   schedule 26.08.2015