В чем разница между `typename std :: remove_reference <T>` и `constexpr typename std :: remove_reference <T>`? - PullRequest
1 голос
/ 28 мая 2020

Согласно документации (https://en.cppreference.com/w/cpp/utility/move), есть два типа конструкторов для std::move<T>, которые опубликованы ниже.

В чем разница между этими конструкторами? Больше всего меня смутило то, почему во втором конструкторе нужно ключевое слово (typename).

Я новичок в C ++. Буду благодарен за любую подсказку по этому вопросу.

template< class T >
typename std::remove_reference<T>::type&& move( T&& t ) noexcept; (since C++11)(until C++14)

template< class T >
constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;  (since C++14)

1 Ответ

3 голосов
/ 28 мая 2020

[...] есть два вида конструкторов для std::move<T> ...

Нет, это не конструкторы, а сигнатуры функций std::move. Один предшествует (т.е. начиная с ), а второй - начиная с C ++ 14.

Во втором спецификатор constexpr используется , что означает

constexpr - указывает, что значение переменной или функции может появляться в постоянных выражениях

подробнее здесь: Для чего полезен constexpr?


Больше всего меня смутило то, зачем нужны ключевое слово (typename) во втором конструкторе.

Согласно cppreference.com , существует вспомогательный тип для std::remove_reference, поскольку

template< class T >
using remove_reference_t = typename remove_reference<T>::type;  (since C++14)

поэтому во втором могло быть

template< class T >
constexpr std::remove_reference_t<T>&& move( T&& t ) noexcept;
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...