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