我正在考虑编写不可复制的异常类。我觉得这很有趣,因为这样我就不必担心复制构造函数中可能抛出的异常。如果异常对象的创建成功,一切都很好,就不应该出现与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()。
问题:根据C++11标准,上述代码是否正确?是否会被符合C++11标准的所有编译器接受?
编辑:将std::rethrow_exception和std::current_exception添加到示例中。两个编译器都接受这个版本。这应该说明,如果编译器在抛出异常时不需要复制构造函数,则使用这两个函数时也不需要复制构造函数。