【发布时间】:2016-11-10 08:59:20
【问题描述】:
考虑以下代码:
struct S {
struct type {};
type type;
};
int main() {
typename S::type t;
(void) t;
}
除了这远非一个好主意之外,我在阅读了关于 SO 的另一个问题后正在尝试。
发现上面的sn-p是compiled with no errors by GCC,是rejected by clang 3.9,报错如下:
错误:类型名说明符引用了 'S' 中的非类型成员 'type'
我怀疑在这种情况下 clang 是正确的,而 GCC 是错误的(实际上,我正在向后者提出问题)。
这是正确的结论还是typename 的有效使用?
注意:我不是在问如何解决它,我知道该怎么做。我只是问这个代码是否有效。
【问题讨论】:
-
像 4.4.7 这样的旧 gcc 也拒绝它:melpon.org/wandbox/permlink/Oh2Rp4jWjGPIoIwv
-
在标准中找不到任何关于此合法性的内容。不过,
typename仅在模板方面被提及,所以也许这违反了精神?无论如何,解决这种特殊歧义的正确和标准方法似乎是struct S::type t; -
@marcinj 那似乎是因为 GCC 4.4.7 没有实现CWG 382: Allow
typenameoutside of templates。 -
所以它的clang错误 - 我发现它报告它已修复:“382 CD1 Allow typename outside of templates Yes (C++11 onwards)”clang.llvm.org/cxx_dr_status.html
标签: c++ gcc clang language-lawyer typename