Вы неправильно поняли первую цитату.Это не сложно, так как это сбивает с толку.
, если создан объект-член с семантикой RAII, и перед завершением конструктора возникает исключение, тогда его деструктор будет вызываться как часть разматывания стека.
Вот что он говорит.Вот что это означало :
, если был создан объект-член с семантикой RAII и произошло исключение во внешнем объекте перед внешним конструктор объекта завершен, тогда деструктор объекта-члена будет вызываться как часть разматывания стека.
Видите разницу?Идея состоит в том, что объект-член завершил свой конструктор, а тип-владелец - нет.Он бросил где-то в своем конструкторе (или конструкторе другого члена, который инициализируется после этого).Это приведет к вызову деструктора всех его членов (то есть всех, кто завершил построение), но не его собственного деструктора.
Вот пример:
class SomeType
{
InnerType val;
public:
SomeType() : val(...)
{
throw Exception;
}
};
Когда вы создаете экземпляр SomeType
, он будет вызывать InnerType::InnerType
.Пока это не сработает, он будет входить в конструктор SomeType
.Когда это бросает, это приведет к уничтожению val
, вызывая, таким образом, InnerType::~InnerType
.