下面使用“typename”有什么区别?

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)

JeJ*_*eJo 5

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”?