Оператор noexcept()
нуждается в истинном выражении.К сожалению, T(T&&)
не является допустимым выражением.
Так что вам нужно создать экземпляр экземпляра T
и использовать std::move()
, чтобы убедиться, что он использует конструктор перемещения, если таковой имеется.Вот подтверждение концепции:
template <typename T>
struct TypeInfo
{
bool test()
{
T t;
bool IsNothrowMoveConstructible = noexcept(T(std::move(t)));
return IsNothrowMoveConstructible;
};
};
Проблема в том, что это становится гораздо более подверженным ошибкам.Если T не имеет конструктора по умолчанию, он не сможет скомпилироваться.То же самое, если конструктор перемещения был неявно или явно удален.
Но если вы можете жить с этими недостатками, так как значение определяется во время компиляции и, следовательно, является постоянным, вы можете использовать член T и определить константу в перечислении:
struct TypeInfo
{
T t;
enum {
IsNothrowMoveConstructible = noexcept(T(std::move(t)))
};
};
Здесь онлайн демо .