异常规格说明中的动态异常规格已被弃用,c++++11引入noexcept作为替代。1. 动态异常规格因运行时开销、性能影响、维护困难和不安全性被逐步淘汰,c++17正式移除。2. noexcept在编译期确定是否抛出异常,提升性能与安全性,语法为void func() noexcept;或noexcept(expression)。3. 移动构造函数、swap和析构函数应优先使用noexcept以支持标准库优化并避免程序终止。4. 析构函数默认noexcept,不应显式抛出异常。5. noexcept非编译期强制检查,仅当异常抛出时调用std::terminate。正确使用noexcept可提高代码性能与可靠性,是现代c++的推荐实践。

异常规格说明(Exception Specifications)在 C++ 中确实已经被弃用(deprecated),尤其是在现代 C++ 标准中,
throw()
noexcept
在 C++98/03 中,可以使用动态异常规格(dynamic exception specification),例如:
void func() throw(std::bad_alloc); // 只允许抛出 std::bad_alloc void func() throw(); // 不允许抛出任何异常(等价于 throw())
但这种语法存在严重问题:
std::unexpected()
throw()
因此,C++11 开始逐步弃用这种动态异常规格:
throw(...)
noexcept
throw()
noexcept
throw()
void func() noexcept; // 承诺不抛出异常 void func() noexcept(true); // 显式说明不抛出 void func() noexcept(false); // 可能抛出异常
noexcept
noexcept
noexcept
noexcept
std::terminate()
noexcept
标准库在做容器扩容(如
std::vector
noexcept
class MyClass {
public:
MyClass(MyClass&& other) noexcept
: data(other.data), size(other.size) {
other.data = nullptr;
other.size = 0;
}
private:
int* data;
size_t size;
};如果你的移动操作不会抛出异常,务必加上
noexcept
noexcept
throw()
旧代码中的
throw()
noexcept
// 旧写法(C++17 起已删除) void cleanup() throw(); // 新写法 void cleanup() noexcept;
noexcept
可以结合表达式,条件性声明是否
noexcept
template<typename T>
void swap(T& a, T& b) noexcept(noexcept(a.swap(b))) {
a.swap(b);
}外层
noexcept(...)
noexcept
noexcept
在 C++11 及以后,析构函数默认是
noexcept
~MyClass() noexcept(false); // 不推荐,可能引发问题
一般建议:析构函数不要抛出异常,否则可能导致
std::terminate
noexcept
throw
noexcept
noexcept
throw(std::bad_alloc)
throw()
noexcept
noexcept
noexcept
noexcept
基本上就这些,不复杂但容易忽略。
以上就是异常规格说明deprecated了吗 noexcept替代方案指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号