Я думаю о написании классов, не подлежащих копированию. Я нахожу это интересным, потому что тогда мне не нужно беспокоиться об исключениях, которые могут быть выбраны при распределении внутри экземпляра-копии. Если создание объекта исключения завершается успешно, все в порядке и не должно быть проблем с std::terminate
.
struct exception
{
exception() = default;
exception(const exception&) = delete;
exception(exception&&) noexcept = default;
~exception() noexcept = default;
auto operator=(const exception&) -> exception& = delete;
auto operator=(exception&&) noexcept -> exception& = delete;
};
int main()
{
try {
try {
throw exception{};
} catch (...) {
std::rethrow_exception(
std::current_exception());
}
} catch (const exception& e) {
return 1;
}
}
GCC-4.7 и Clang-3.2 принимают вышеуказанный код. Однако я немного удивлен. Насколько я знаю, существует несколько ситуаций, когда объекты исключений могут быть скопированы, например. std::current_exception()
и std::rethrow_exception()
.
Вопрос: Является ли приведенный выше код правильным в соответствии с С++ 11, то есть он будет принят всеми компиляторами, соответствующими С++ 11?
Отредактировано: Добавлены std::rethrow_exception
и std::current_exception
к примеру. Оба компилятора принимают эту версию. Это должно дать понять, что если компилятор не требует конструктора-копии, когда генерируется исключение, компилятор не будет требовать его при использовании этих двух функций.