bitmask bitmask - 11 days ago 5
C++ Question

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

Assume I have a wrapper type

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


and I cannot just
X(X&&) = default
because I have to do non-trivial stuff there.

However, I want it to be
noexcept
but only in case that
T(T&&)
is
noexcept
. This can be tested with
::std::is_nothrow_move_constructible
.

I'm at a loss how to conditionally enable one version of the constructor or the other depending on a
constexpr
.
I suppose there could be a way to use SFINAE, but I don't see how to apply it to ctors.

Answer

The noexcept specifier accepts any boolean constant expression, so you can but your type trait check in there directly:

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