[...] есть два вида конструкторов для std::move<T>
...
Нет, это не конструкторы, а сигнатуры функций std::move
. Один предшествует c ++ 14 (т.е. начиная с c ++ 11 ), а второй - начиная с C ++ 14.
Во втором спецификатор constexpr
используется , что означает
constexpr
- указывает, что значение переменной или функции может появляться в постоянных выражениях
подробнее здесь: Для чего полезен constexpr?
Больше всего меня смутило то, зачем нужны ключевое слово (typename
) во втором конструкторе.
Согласно cppreference.com , существует вспомогательный тип для std::remove_reference
, поскольку c + + 14
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;
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^