提问人:Crackie 提问时间:8/3/2023 最后编辑:JeJoCrackie 更新时间:8/3/2023 访问量:102
在以下使用“typename”有什么区别?
What is the difference of using `typename` in the following?
问:
在函数的返回类型之前使用“”和在函数的声明中不使用它有什么区别,如下所示?typename
如果我们根本不使用它有什么不同?
template< class T > typename std::remove_reference<T>::type&& move( T&& t );
template< class T > std::remove_reference_t<T>&& move( T&& t ) ;
答:
2赞
NoReason
8/3/2023
#1
https://en.cppreference.com/w/cpp/keyword/typename
(链接中的第二点)
- 在声明或模板的定义中,typename 可用于声明依赖限定名是类型。
当您使用 时,编译器无法确定是什么,可能是成员变量或类型或其他任何东西。因此,您必须在前面向编译器提示它是一个类型名。foo_type::bar
bar
typename
评论
3赞
chrysante
8/3/2023
If 依赖于模板参数。此外,您没有提到这两个声明之间的区别是什么。foo_type
1赞
NoReason
8/3/2023
我想说,没有,代码是不可编译的。但是@JeJo提到,只有当标准在 c++20 之前时才是正确的,他也提供了大量的详细解释和相关文章。我觉得这个答案其实太简单了。typename
5赞
JeJo
8/3/2023
#2
在函数的返回类型之前使用 '' 关键字的目的是什么?
typename
在 中,取决于模板类型。编译器(直到 C++20)不知道这一点,需要告诉这一点,以便编译器理解它是一种类型。这就是关键字的原因。std::remove_reference<T>::type
::type
T
typename
阅读更多:什么时候需要“typename”关键字?
第二个 ,是模板类型别名,如下所示: std::remove_reference_t<T>
template< class T >
using remove_reference_t = typename remove_reference<T>::type; (since C++14)
并允许您保存一些打字(又名为方便起见)。
如果我们根本不使用它有什么不同?
从 C++20 开始,您可以简单地编写带有或不带有 typename
关键字的关键字,在此之前编译器可能不会将其解释为类型。
阅读更多:为什么我不需要在 C++20 中的依赖类型之前指定“typename”?
评论
1赞
Crackie
8/3/2023
非常感谢!这个答案解释了一切!
评论
typename
std::remove_reference_t