|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<class T, std::enable_if_t<std::is_nothrow_move_constructible<T>::value, int> = 0> |
|
|
|
|
|
constexpr T&& forward_if_nothrow_move_constructible(T&& value) |
|
|
|
|
|
|
|
|
template<class T, class U = std::conditional_t<std::is_nothrow_move_constructible<T>::value, T&&, const T&>> |
|
|
|
|
|
constexpr U forward_if_nothrow_move_constructible(T&& value) |
|
|
{ |
|
|
{ |
|
|
return std::forward<T>(value); |
|
|
return std::forward<T>(value); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
template<class T, std::enable_if_t<!std::is_nothrow_move_constructible<T>::value, int> = 0> |
|
|
|
|
|
constexpr const T& forward_if_nothrow_move_constructible(T&& value) |
|
|
|
|
|
{ |
|
|
|
|
|
return value; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template<class R, class D> |
|
|
template<class R, class D> |