c++ 在下面的代码中使用'typename'有什么区别?

rmbxnbpk  于 2023-08-09  发布在  其他
关注(0)|答案(2)|浏览(95)

在函数的返回类型之前使用“typename”和在函数的声明中不使用它有什么区别?
如果我们根本不使用它又有什么不同呢?

template< class T > typename std::remove_reference<T>::type&& move( T&& t );
template< class T > std::remove_reference_t<T>&& move( T&& t ) ;

字符串

uqzxnwby

uqzxnwby1#

在函数的返回类型之前使用' typename '关键字的目的是什么?
std::remove_reference<T>::type中,::type依赖于模板类型T。编译器(直到C++20)不知道这一点,需要告诉它,以便编译器理解它是一个类型。这就是为什么typename关键字是。
阅读更多:When is the "typename" keyword necessary?
第二个std::remove_reference_t<T>template type alias,看起来像:

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

字符串
并允许你保存一些打字(aka。为了方便)。
如果我们根本不使用它,有什么不同?
Since C++20, you can simply write with or without typename keyword,在此之前,编译器可能不会将其解释为类型。
阅读更多:Why don't I need to specify "typename" before a dependent type in C++20?

wj8zmpe1

wj8zmpe12#

https://en.cppreference.com/w/cpp/keyword/typename
(2nd链接中的点)

  • 在模板的声明或定义中,typename可用于声明依赖限定名是类型。

当你使用foo_type::bar时,编译器不能确定bar是什么,可能是一个成员变量或类型或其他任何东西。因此,你必须在typename之前提示编译器它是一个类型名。

相关问题