如何声明包装器类型 X 的移动构造函数<T> noexcept 取决于is_nothrow_move_constructible<T>?

How can I declare a move constructor of a wrapper type X<T> noexcept depending on is_nothrow_move_constructible<T>?

本文关键字:gt lt noexcept is constructible move nothrow 取决于 构造函数 声明 何声明      更新时间:2023-10-16

假设我有包装器类型

template <typename T>
struct X {/*..*/};

我不能只是X(X&&) = default,因为我必须在那里做非平凡的事情。

但是,我希望它是noexcept,但仅在T(T&&)noexcept的情况下。可以用::std::is_nothrow_move_constructible进行测试。

我不知所措地如何有条件地启用构造函数的一个版本或另一个版本,具体取决于 constexpr我想可能有一种使用sfinae的方法如何将其应用于CTOR。

noexcept指示符接受任何布尔常数表达式,因此您可以直接在那里检查您的类型特征:

template <typename T>
struct X {
    X(X&&) noexcept(std::is_nothrow_move_constructible<T>::value) {}
};