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

What is the difference of using `typename` in the following?

提问人:Crackie 提问时间:8/3/2023 最后编辑:JeJoCrackie 更新时间:8/3/2023 访问量:102

问:

在函数的返回类型之前使用“”和在函数的声明中不使用它有什么区别,如下所示?typename

如果我们根本不使用它有什么不同?

template< class T > typename std::remove_reference<T>::type&& move( T&& t );
template< class T > std::remove_reference_t<T>&& move( T&& t ) ;
C++ 返回 函数模板 类型名称

评论

3赞 Nelfeal 8/3/2023
的存在并不是这两个声明之间的唯一区别。typename
0赞 Caleth 8/3/2023
提示:看定义std::remove_reference_t
1赞 Crackie 8/3/2023
如有任何直接答案,请:(
1赞 molbdnilo 8/3/2023
您是否尝试删除它并查看会发生什么?
0赞 Crackie 8/3/2023
@molbdnilo .我做到了——但你怎么知道:D

答:

2赞 NoReason 8/3/2023 #1

https://en.cppreference.com/w/cpp/keyword/typename

(链接中的第二点)

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

当您使用 时,编译器无法确定是什么,可能是成员变量或类型或其他任何东西。因此,您必须在前面向编译器提示它是一个类型名。foo_type::barbartypename

评论

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::typeTtypename

阅读更多:什么时候需要“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
非常感谢!这个答案解释了一切!