【问题标题】:Why is `typename` prefix still required in such a case in C++20?为什么在 C++20 的这种情况下仍然需要 `typename` 前缀?
【发布时间】: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这里需要?

online demo

【问题讨论】:

  • 我想它以某种方式简化了编译器编写者的工作。
  • 模板参数很奇怪。我知道这与这个概念案例不同,但是:如果参数可以被解析为表达式或类型(例如int()),那么无论使用的模板如何声明,它始终是一个类型。另一方面,如果参数是类模板的注入类名,它可能表示模板或当前实例化类型,其含义确实取决于所使用模板的声明。

标签: c++ standards c++20 c++-concepts typename


【解决方案1】:

答案是松散地谈论“上下文”的含义。 the feature 正在做的是寻找在语法上不可能在该位置出现除类型名之外的任何东西的地方。就是那些不再需要typename 的地方。

例如,using name = X;。从语法上讲,这是一个类型别名声明。因此,无论X 是什么,语法要求它是一个类型。如果X 恰好是依赖于模板参数的名称,那么无论该名称是什么,都必须是一个类型。所以语法是明确的,typename 是多余的。

语法name&lt;X&gt; 声明X 是模板name 的模板参数。但模板参数不必是类型。 特定模板可以将类型作为特定参数,但语法上X 可以是引用变量或模板的标识符。因此,您必须消除歧义依赖Xs。

【讨论】:

    猜你喜欢
    • 2016-08-08
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多