C++ “typename std::remove_reference”和“constexpr typename std::remove_reference”之间有什么区别?

C++ “typename std::remove_reference”和“constexpr typename std::remove_reference”之间有什么区别?,c++,c++11,move,c++-standard-library,typename,c++14,C++,C++11,Move,C++ Standard Library,Typename,C++14,根据文档,std::move有两种构造函数,它们发布在下面 这些构造函数之间有什么区别? 最让我困惑的是为什么在第二个构造函数中需要关键字TypeName 我是C++初学者。如果你能在这个问题上给我任何提示,我将不胜感激 template< class T > typename std::remove_reference<T>::type&& move( T&& t ) noexcept; (since C++11)(until C++14

根据文档,std::move有两种构造函数,它们发布在下面

这些构造函数之间有什么区别? 最让我困惑的是为什么在第二个构造函数中需要关键字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)
[…]std::move有两种构造函数

不,它们不是构造函数,而是std::move的函数签名。一个优先于,即自,第二个优先于C++14

在第二个例子中,意思是

constexpr-指定变量或函数的值可以 以恒定表达式出现

请在此处阅读更多信息:

最让我困惑的是,为什么需要在 第二个构造函数

根据,std::remove_引用有一个助手类型,因为

因此,在第二个例子中,它可能是

template< class T >
constexpr std::remove_reference_t<T>&& move( T&& t ) noexcept;
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[…]std::move有两种构造函数

不,它们不是构造函数,而是std::move的函数签名。一个优先于,即自,第二个优先于C++14

在第二个例子中,意思是

constexpr-指定变量或函数的值可以 以恒定表达式出现

请在此处阅读更多信息:

最让我困惑的是,为什么需要在 第二个构造函数

根据,std::remove_引用有一个助手类型,因为

因此,在第二个例子中,它可能是

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

为什么前一个函数签名不需要关键字typename?谢谢。@sunshilong369 traits std::remove_引用的结果类型取决于模板类型T,它需要通过typename关键字向编译器提及。这里有更多的例子:你看,前面的函数签名中有std::remove_引用,太好了。那为什么不需要在它前面加上typename呢?对不起。我的眼睛欺骗了我。它们里面确实都有typename关键字。我的心里充满了感谢。为什么以前的函数签名不需要关键字typename?谢谢。@sunshilong369 traits std::remove_引用的结果类型取决于模板类型T,需要通过typename关键字向编译器提及。这里有更多的例子:你看,以前的函数签名中也有std::remove_引用。那么为什么不需要在它前面加上typename呢?对不起,我的眼睛欺骗了我。它们中确实都有typename关键字。我的心里充满了感谢。