Cra*_*kie 2 c++ templates return-type typename function-templates
typename在函数的返回类型之前使用“”与在函数声明中不使用它(如下所示)有什么区别?
如果我们根本不使用它,会有什么不同呢?
template< class T > typename std::remove_reference<T>::type&& move( T&& t );
template< class T > std::remove_reference_t<T>&& move( T&& t ) ;
Run Code Online (Sandbox Code Playgroud)
typename在函数的返回类型之前使用“”关键字的目的是什么?
在 中std::remove_reference<T>::type,::type取决于模板类型T。编译器(直到 C++20)不知道这一点,需要告诉编译器,以便编译器理解它是一种类型。typename这就是关键字的原因。
阅读更多:什么时候需要“typename”关键字?
第二个 std::remove_reference_t<T>是模板类型别名,如下所示:
template< class T >
using remove_reference_t = typename remove_reference<T>::type; (since C++14)
Run Code Online (Sandbox Code Playgroud)
并允许您节省一些打字(也称为方便起见)。
如果我们根本不使用它有什么不同?
从 C++20 开始,您可以简单地使用或不使用typename关键字来编写,在此之前编译器可能不会将其解释为类型。
了解更多: 为什么我不需要在 C++20 中的依赖类型之前指定“typename”?