假设我有一个包装类型
template <typename T>
struct X {/*..*/};
我不能只是X(X&&) = default
,因为我必须在那里做一些非平凡的事情。
但是,我希望它为noexcept
,但仅限T(T&&)
为noexcept
的情况。这可以使用::std::is_nothrow_move_constructible
进行测试。
我不知道如何有条件地启用一个版本的构造函数或另一个版本取决于constexpr
。我想可能有办法使用SFINAE,但我不知道如何将它应用于ctors。
答案 0 :(得分:10)
noexcept
说明符接受任何布尔常量表达式,因此你可以直接检查你的类型特征:
template <typename T>
struct X {
X(X&&) noexcept(std::is_nothrow_move_constructible<T>::value) {}
};