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

时间:2016-11-24 12:35:38

标签: c++ template-meta-programming noexcept

假设我有一个包装类型

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

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

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

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

1 个答案:

答案 0 :(得分:10)

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

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