gpt4 book ai didi

c++ - 为什么仍然需要在 using 语句的 RHS 中消除依赖类型与 typename 的歧义?

转载 作者:IT老高 更新时间:2023-10-28 14:01:00 27 4
gpt4 key购买 nike

我很清楚为什么需要将 typename 用于依赖类型,因为当编译器看到类似 T 的内容时,可能无法区分类型和变量声明: :type,参见例如this answer一个很好的解释。 TL;DR:在像 T::type * x; 这样的表达式中,编译器无法“知道” T::type 是否为类型或者可能是在 T 的某些特定特化中声明的变量。

但是,像

using type = T::type;

没有什么模棱两可的。 IMO,T::type 应始终被解析为类型,因为它是 using 语句的 RHS 的一部分。但是,我们这里还是需要使用typename(至少根据gcc和clang),

using type = typename T::type;

Live on Coliru, gcc Live on Coliru, clang

Visual C++ seems to accept the code没有 typename,但是我不太相信编译器完全符合标准(事实上,它有许多非标准扩展,例如将右值绑定(bind)到非 const 引用)。

问题:是否有任何理由说明这不是 C++11 及更高版本中 typename 规则的异常(exception)?

最佳答案

没有什么硬道理。如ralismark said ,今年讨论了一篇论文(针对 C++20,而不是 17!)。有担忧,但也有反对意见:

  1. 这可以被视为使语言不那么规则(如 codeshot said ),但新的想法是消除歧义 typename 将变得非常罕见,以至于在另一个方向上几乎保持一致。 (作为 has been said ,已经有一个以基类名称形式存在的异常(exception)情况。)
  2. 它可以排除可能的扩展名(如 T.C. reported ),但扩展名可以有自己的歧义,而不是增加常见情况的负担。

论文得到大力支持,新规则可能会在几个月后出现在工作草案中。

关于c++ - 为什么仍然需要在 using 语句的 RHS 中消除依赖类型与 typename 的歧义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41841516/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com