Как ссылаться на конструктор перемещения в операторе noexcept - PullRequest
0 голосов
/ 01 октября 2018

Я реализую класс TypeInfo со свойством IsNothrowMoveConstructible.Я хотел бы установить для этого параметра значение true, если конструктор перемещения типа T помечен как noexcept.Ссылка на конструктор по умолчанию с помощью noexcept (noexcept (T ())), кажется, работает, однако я еще не выяснил, как ссылаться на конструктор перемещения.Я думаю, что решение будет примерно таким:

template <typename T> 
struct TypeInfo 
{
    enum
    {
        ...
        IsNothrowMoveConstructible = noexcept(noexcept(T(T&&))),
        ...
    };
};

Я знаю, что могу использовать std :: is_nothrow_move_constructible, но моя цель - выяснить, как использовать оператор noexcept () в такой ситуации.

1 Ответ

0 голосов
/ 01 октября 2018

Оператор 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)))
    }; 
};

Здесь онлайн демо .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...