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

bit*_*ask 9 c++ template-meta-programming noexcept

假设我有一个包装类型

template <typename T>
struct X {/*..*/};
Run Code Online (Sandbox Code Playgroud)

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

不过,我希望它是noexcept,但只有在这种情况下T(T&&)noexcept.这可以测试::std::is_nothrow_move_constructible.

我不知道如何有条件地启用一个版本的构造函数或另一个版本取决于a constexpr.我想可能有办法使用SFINAE,但我不知道如何将它应用于ctors.

Tar*_*ama 10

noexcept说明符接受任何布尔常量表达式,所以你可以,但在有直接的类型特点的检查:

template <typename T>
struct X {
    X(X&&) noexcept(std::is_nothrow_move_constructible<T>::value) {}
}; 
Run Code Online (Sandbox Code Playgroud)