我正在考虑编写不可复制的异常类。我觉得这很有趣,因为这样我就不必担心在复制构造函数中分配期间可能引发的异常。如果异常对象的创建成功,一切都很好,应该没有问题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
示例中。两个编译器都接受这个版本。这应该清楚地表明,如果编译器在引发异常时不需要复制构造函数,那么在使用这两个函数时编译器将不需要复制构造函数。