C++03的throw()说明符和C++11的noexcept之间有什么区别
What is the difference between C++03 `throw()` specifier and C++11 `noexcept`?
除了在运行时和编译时分别检查之外,throw()
和noexcept
之间有什么区别吗?
这篇Wikipedia C++11文章建议不赞成使用C++03抛出说明符
为什么。。。noexcept
是否能够在编译时覆盖所有这些?
注意:我检查了这个问题和这篇文章,但无法确定它被弃用的确切原因。
不赞成使用异常说明符,因为异常说明符通常是一个糟糕的想法。添加noexcept
是因为它是异常说明符的一个合理有用的用途:知道函数何时不会抛出异常。因此,它变成了一个二进制选择:将抛出的函数和不抛出的函数。
添加了noexcept
,而不是仅仅删除除throw()
之外的所有抛出说明符,因为noexcept
更强大。noexcept
可以有一个编译时解析为布尔值的参数。如果布尔值为true,则noexcept
将保持不变。如果布尔值为false,则noexcept
不会固定,函数可能会抛出。
因此,你可以这样做:
struct<typename T>
{
void CreateOtherClass() { T t{}; }
};
CreateOtherClass
是否抛出异常?如果T
的默认构造函数可以的话,它可能会。我们该怎么说?像这样:
struct<typename T>
{
void CreateOtherClass() noexcept(is_nothrow_default_constructible<T>::value) { T t{}; }
};
因此,CreateOtherClass()
将抛出给定类型的默认构造函数抛出的iff。这修复了异常说明符的一个主要问题:它们无法向上传播到调用堆栈。
使用throw()
无法做到这一点。
noexcept
在编译时未检查。
实现不应仅仅因为执行时抛出或可能抛出包含函数不允许的异常而拒绝表达式。
当声明为noexcept
或throw()
的函数试图抛出异常时,唯一的区别是一个调用terminate
,另一个调用unexpected
,后一种类型的异常处理实际上已被弃用。
std::unexpected()
:从其异常规范禁止此类型异常的函数抛出异常。
CCD_ 21也可以直接从程序中调用。
在任何一种情况下,std::unexpected
都会调用当前安装的std::unexpected_handler
。默认的std::unexpected_handler
调用std::terminate
。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 构造函数和转换运算符之间的重载解析
- C++03的throw()说明符和C++11的noexcept之间有什么区别