Каков эффект вызова тривиального деструктора? - PullRequest
4 голосов
/ 06 апреля 2020

Завершает ли вызов тривиальный деструктор время жизни объекта? Я прочитал это и это , но не нашел хорошего объяснения. Эти потоки утверждают, что тривиальный вызов деструктора не имеет никакого эффекта, а код типа struct A { int x; } a; a.~A(); a.~A(); допустим. Но я нашел этот пример в стандарте:

struct C { };
void f() {
    C * pc = new C;
    using C2 = C;
    pc->C::~C2(); // OK, destroys *pc
    C().C::~C(); // undefined behavior: temporary of type C destroyed twice
    using T = int;
    0 .T::~T(); // OK, no effect
    0.T::~T(); // error: 0.T is a user-defined-floating-point-literal (5.13.8)
}

Здесь C имеет тривиальный деструктор, но двойное уничтожение объекта типа C имеет неопределенное поведение?

1 Ответ

3 голосов
/ 06 апреля 2020

Начиная с C ++ 20 тривиальных вызова деструкторов заканчивают время жизни объектов. До этого они этого не делали, и было допустимо вызывать деструктор несколько раз.

В C ++ 17 (черновик N4659) тривиальные деструкторы явно исключены из окончания времени жизни в [basi c. жизнь] /1.3 и объекты с тривиальным деструктором будут жить до тех пор, пока не истечет срок их хранения или их повторное использование ( [basi c .life] /1.4).

Это было изменено с разрешением проблемы CWG 2256 в этом черновом коммите .

Также обратите внимание, что вызовы псевдодеструктора также заканчивают время жизни в C ++ 20, но не до этого. Оба вопроса, на которые вы ссылаетесь в своем вопросе, говорят о таких псевдодеструкторных вызовах. См. Примечание о совместимости с C ++ 17 в [diff.cpp17.basic] / 1 черновика (N4861).

...