【发布时间】:2021-10-22 17:11:40
【问题描述】:
根据https://stackoverflow.com/a/61991146/508343:
C++20 中的一个新特性是Down with typename。
在 C++17 中,您几乎必须提供 typename 关键字† 依赖上下文来区分类型和值。但在 C++20 中, 这个规则放松了很多。 在您需要拥有 type,typename 关键字不再是强制性的。
template<typename T>
concept IsOK = true;
template<typename T>
requires IsOK<T::U> // error: use ‘typename T::U’
void f()
{}
struct A
{
using U = int;
};
int main()
{
f<A>();
}
在上面的代码中,显然IsOK 概念只能接受类型。
为什么typename这里需要?
【问题讨论】:
-
我想它以某种方式简化了编译器编写者的工作。
-
模板参数很奇怪。我知道这与这个概念案例不同,但是:如果参数可以被解析为表达式或类型(例如
int()),那么无论使用的模板如何声明,它始终是一个类型。另一方面,如果参数是类模板的注入类名,它可能表示模板或当前实例化类型,其含义确实取决于所使用模板的声明。
标签: c++ standards c++20 c++-concepts typename