1

我在使用类型别名和嵌套类/范围时遇到了一个奇怪的问题。以下代码被 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 编译?代码是有效还是无效?

4

1 回答 1

2

问题在 3.3.7/1 [basic.scope.class] 中:

2) 在类 S 中使用的名称 N 应在其上下文中引用相同的声明,并且在 S 的完整范围内重新评估时。对于违反本规则的情况不需要诊断。

type_t您在 中使用名称Inner,但在 . 的声明之前Inner::type_t。所以名称指的是两种不同的声明,违反了规则。

不需要诊断,因此 clang 在技术上不是不合格的,但在这里出现错误会很好。

于 2013-10-07T18:41:53.360 回答