Во время Андрея Александреску поговорим об обработке ошибок:
Смотрите С++ и Beyond 2012: Андрей Александреску - систематическая обработка ошибок на С++ (около 30 минут)
Андрей представляет следующий фрагмент кода:
~Expected()
{
using std::exception_ptr;
if (gotHam) ham.~T();
else spam.~exception_ptr();
}
Этот деструктор очищает a union
, который содержит либо некоторый тип T
, либо std::exception_ptr
. Объединение заполняется с помощью placement new
.
Затем Андрей объясняет, что using std::exception_ptr;
необходимо, потому что следующий код не анализирует:
else spam.~std::exception_ptr();
Это означает, что всегда необходимо иметь директиву using, если вам нужно явно вызвать деструктор класса в другом пространстве имен.
Почему второй пример не анализируется?
Может ли код followng быть допустимой альтернативой?
else delete spam;
Имеет ли это тот же эффект, что и явный вызов деструктора std::exception_ptr