Допустимо ли исключение prvalue в выражениях броска

В §[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?

1 ответ

Из недавнего проекта стандарта

11,6 [dcl.init]/15

Инициализация, которая происходит в форме инициализатора или условия скобки или равенства (9.4), а также при передаче аргумента, возврате функции, генерации исключения (18.1), обработке исключения (18.3) и инициализации агрегатного члена (11.6.1), называется инициализацией копирования.

Так T x = T(); пример инициализации копирования Так же бросают исключения и многие другие случаи.

То, что делает инициализация копии, определено в других частях 11.6 (наряду с другими формами инициализации). Соответствующий раздел о значениях в инициализаторах:

11,6 [dcl.init]/17.6.1

Если выражение инициализатора является prvalue, а версия cv-unqualified типа источника является тем же классом, что и класс назначения, выражение инициализатора используется для инициализации объекта назначения

это также известно как гарантированное исключение. Если выражение инициализатора является выражением prvalue соответствующего типа, выражение prvalue используется для непосредственного создания цели инициализации.

Другие вопросы по тегам