C++20 的新特性之一是Down with typename。
在 C++17 中,您必须在几乎所有†依赖上下文中提供 typename 关键字以消除类型与值的歧义。但是在 C++20 中,这个规则放宽了很多。在需要类型的所有上下文中, 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>();
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,显然,IsOK概念只能接受类型。
为什么 typename 这里需要?
看在线演示