【发布时间】:2017-06-10 00:55:39
【问题描述】:
我非常清楚为什么需要将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,但是我不太相信编译器完全符合标准(事实上,它有许多非标准扩展,例如将右值绑定到非 const 引用)。
问题:是否有任何理由说明这不是 C++11 及更高版本中 typename 规则的例外?
【问题讨论】:
-
对于不赞成票的人:我不是为了获得分数而提问。如果你认为这个问题是废话,或者答案是微不足道的,至少让我知道。我非常希望看到现代 C++ 被简化,并且获得更简洁的语法是 (imo) 值得的。
-
谢谢,这很有说服力。
-
@BenVoigt 有趣的是,VC++ 接受代码,rextester.com/HYWJH30088。但是(正如更新的编辑中提到的),我并不真正相信 VC++ 作为一个完全符合标准的编译器。感谢您的示例,是的,它具有相同的风格,但是使用
typedef时,解析起来会有些困难。不过有了using,即使是我自己也能很快写出解析器。 -
标准讨论中出现的理由之一?上次出现的原因是它阻止了潜在的进化路径(例如,使用
using声明表达式别名)。 -
已经有一个提案 (p0634r0),虽然我不确定它的当前状态。
标签: c++ c++11 language-lawyer