递归 noexcept() 的含义是什么?
What's the meaning of recursive noexcept()?
标准库定义了数组的交换,std::pair
如下所示:
template <class T, size_t N>
void swap(T (&a)[N],
T (&b)[N]) noexcept(noexcept(swap(*a, *b)));
template <class T1, class T2>
struct pair {
…
void swap(pair& p) noexcept(noexcept(swap(first, p.first)) &&
noexcept(swap(second, p.second)));
…
};
有效的现代C++第 14 项说:
[...]它们是否
noexcept
取决于noexcept
子句中的表达式是否noexcept
。
例如,给定两个Widget
数组,只有当交换数组中的单个元素noexcept
时,即如果交换Widget
是noexcept
,交换它们才noexcept
。
这反过来又决定了其他交换,例如Widget
数组数组的交换是否noexcept
。
同样,交换两个包含Widget
s 的std::pair
对象是否noexcept
取决于交换Widget
s 是否noexcept
。
但是从这个解释中,我不明白为什么有必要将调用嵌套为noexcept(noexcept(swap(*a, *b)))
。
如果目标是"交换两个数组应该像交换元素一样noexcept
",为什么noexcept(swap(*a, *b))
不够?
这些是不同的noexcept()
过载还是什么?
这不是"递归"noexcept
,noexcept
关键字只有两种用法:
noexcept
说明符 - 将函数标记为noexcept
,并可选择将布尔常量表达式作为参数noexcept
运算符 - 将表达式作为参数并返回一个布尔常量表达式,表示表达式是否noexcept
在您的情况下:
// `noexcept` operator
// v~~~~~~~~~~~~~~~~~~~~~
noexcept(noexcept(swap(*a, *b)))
// ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// `noexcept` specifier
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- "noexcept-expression 由于对......的调用而计算为'假'"是什么意思?
- 递归 noexcept() 的含义是什么?
- 对于默认定义的移动构造函数,noexcept的规则是什么