如何根据 is_nothrow_move_constructible<T> 声明包装类型 X<T> noexcept 的移动构造函数?

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

假设我有一个包装类型

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

而且我不能只是 X(X&&) = default 因为我必须在那里做一些重要的事情。

但是,我希望它是 noexcept,但前提是 T(T&&)noexcept。这可以用 ::std::is_nothrow_move_constructible.

来测试

我不知道如何根据 constexpr. 有条件地启用构造函数的一个版本或另一个版本我想可能有一种方法可以使用 SFINAE,但我不知道如何将其应用于 ctors。

noexcept 说明符接受任何布尔常量表达式,因此您可以直接检查类型特征:

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