В §[except.throw]
стандарт гласит, что создание исключительной копии инициализирует объект исключения из выражения выброса
Создание исключительной копии инициализирует (11.6, 15.8) временный объект, называемый объектом исключения
Почему тогда следующий код компилируется на C ++ 17?
class Exception {
public:
Exception() = default;
Exception(Exception&&) = delete;
Exception(const Exception&) = delete;
};
int main() {
throw Exception{};
return 0;
}
(https://wandbox.org/permlink/R3WfzfnBAORTLVSy)
Инициализация копии не включает в себя ни одного случая (из того, что мне кажется), который может быть исключен. Почему тогда вышеупомянутый код компилируется в C ++ 17?
Из недавнего проект стандарта
Инициализация, которая происходит в форме инициализатора скобки или равных
или условие (9.4), а также при передаче аргумента, возврате функции, генерировании исключения (18.1), обработке исключения (18.3) и инициализации составного элемента (11.6.1) называется copy-initialization.
Так T x = T();
пример инициализации копирования Так же бросают исключения и многие другие случаи.
То, что делает инициализация копии, определено в других частях 11.6 (наряду с другими формами инициализации). Соответствующий раздел о значениях в инициализаторах:
Если выражение инициализатора является prvalue, а версия cv-unqualified типа источника является тем же классом, что и класс назначения, выражение инициализатора используется для инициализации объекта назначения
это также известно как гарантированное исключение. Если выражение инициализатора является выражением prvalue соответствующего типа, выражение prvalue используется для непосредственного создания цели инициализации.
Других решений пока нет …