考虑这个类:
class C1 {
C1(C1&&) = default; // declare and define move ctor
};
因为 C1 的 move ctor 在它的第一个声明中被显式默认,标准的 8.4.2 告诉我们它具有相同的异常规范 (ES),就好像函数被隐式声明一样。然后我们可以使用 15.4/14 和 12.8/15 得出其 ES 为 的结论noexcept(true)
。
现在考虑一个相同的类 C2,除了它的移动 ctor 在类定义之外是默认的:
class C2 {
C2(C2&&); // declare move ctor
};
C2::C2(C2&&) = default; // define move ctor
C2 的 move ctor 的 ES 是什么?因为它在第一次声明时没有默认,所以 8.4.2/2 不适用。因为它没有明确的 ES,所以 8.4.2/3 不适用。因为它没有隐式声明,所以 15.4/14 不适用。据我所知,这意味着 15.4/12 适用,它表示默认函数 ES 是noexcept(false)
.
如果我是对的,那意味着 C1 中的移动 ctor 是noexcept(true)
,但 C2 中概念上相同的移动 ctor 是noexcept(false)
。
我对 C2 的推理是否正确?