2

Я только что написал следующую программу & компилирует & работает отлично. (См видеодемонстрацию 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 говорит, что:

Вы не можете вызвать деструктор для скалярных типов, так как они не имеют один. Заявление разрешено только для кода шаблона, в котором вы вызывают деструктор объекта, тип которого вы не знаете, - он устраняет необходимость написания специализации для скалярных (или даже массивов) типов.

Итак, я не понимаю объяснений, данных им. Было бы лучше, если кто-то объяснит это с помощью кода шаблона, в котором деструктор вызывается объектом, тип которого неизвестен. Я был бы благодарен, если кто-то объяснит это, используя простой пример.

+0

@vsoftco: почему никто не дал ответа до сих пор? SO быстро, когда каждый раз, когда я отправляю какие-либо вопросы, но на этот раз выглядит так медленно. – Destructor

+0

Я связался с тем же вопросом, заданным в другом месте, хотя в этом вопросе еще нет полного ответа, он будет связан ссылками –

+0

@vsoftco ok, стирая –

ответ

0

В соответствии с this:

Тривиальным деструктор деструктор, который не выполняет никаких действий. Объекты с тривиальными деструкторами не требуют выражения для удаления и могут быть удалены путем простого освобождения их хранилища. Все типы данных, совместимые с языком C (типы POD), тривиально разрушаемы.

Вероятно, это точно также тот факт, что в C++ можно инициализировать любого типа POD объект, как и любой объект типа класса, вызывая его конструктор с (init_val), например int i(-1);

Но обратите внимание, что по определению вызывающем деструктор непосредственно для обычного объекта, такой как локальная переменная, вызывает неопределенное поведение, когда деструктор вызывается снова, в конце области.

+1

«Никакое действие» на самом деле не означает, что он говорит.Тривиальный деструктор можно вызвать несколько раз или вообще не использовать, и это не имеет никакого значения. (Нет UB.) – Potatoswatter

+0

@Potatoswatter определение * тривиального деструктора * в 12.4 предполагает, что только типы классов могут иметь деструктор (не говоря уже о тривиальном деструкторе, который является не-пользовательским деструктором класса, удовлетворяющего определенным требованиям) –

+0

@AlexLop. ваш ответ, кажется, противоречит самому себе, вы говорите, что код OP вызывает неопределенное поведение или нет? –