我遇到了使用类型别名和嵌套类/作用域的奇怪问题。 clang 3.3很高兴接受以下代码,但是被nuwen MinGW 4.8.1拒绝了
template<typename T>
struct container
{
};
struct Outer
{
using type_t = int;
struct Inner
{
using container_t = container<type_t>;
using type_t = Outer::type_t; //error in MinGW
};
};
gcc:http://ideone.com/cba6Fp生成的错误(与我系统上的错误匹配)
要修复MinGW中的错误,只需将container_t
的定义移至type_t
之后(这是有意义的,也是我原本应该做的) - 不过我的问题是为什么这样做?用clang而不是MinGW编译?代码有效还是无效?
答案 0 :(得分:2)
问题出在3.3.7 / 1 [basic.scope.class]:
2)在S类中使用的名称N应在其上下文中引用相同的声明,并在完成的S范围内重新评估。违反此规则不需要诊断。
您在type_t
中使用名称Inner
,但在声明Inner::type_t
之前。所以这个名字指的是两个不同的声明,违反了规则。
不需要诊断,所以clang在技术上不符合要求,但这里的错误会很好。