用clang和g ++重新排序类成员

时间:2015-01-28 05:19:12

标签: c++ g++ clang

该计划

#include <iostream>

typedef int T;

struct A
{
    typedef char T;
    T i;
};

int main(){ }

应该是格式不正确的,因为N4296::3.3.7/5 [basic.scope.class]

  

如果在类中重新排序成员声明会产生备用有效   根据(1)和(2)的程序,该程序是不正确的,没有诊断   必需的。

但clang和g ++都编译得很好

G++

CLANG

这是他们的错误吗?

1 个答案:

答案 0 :(得分:0)

  

如果在类中重新排序成员声明会产生备用有效   程序在(1)和(2)下,该程序格式错误,没有   诊断是必需的。

尽管由于CWG issue #1875而删除了这个确切的(多余的)子弹点,但请注意粗体部分;如果我们重新排序声明

struct A
{
    T i;
    typedef char T;
};

该计划不符合规则2):

  

2)类N中使用的名称S应引用相同的声明   在其背景下以及在S的完整范围内重新评估时。没有   违反此规则需要诊断。

T用于i的声明,其中指的是全局typedef。但是,当在A的完整范围内重新评估时,T引用成员typedef,这显然是一个不同的声明。
但是,您的代码不会违反此规则。

该标准给出了一个示例,以显示我的第一个片段与您的片段之间的区别,以及它们的有效性。 [basic.scope.class] / 5:

typedef char* T;
struct Y {
    T a;             // error: T refers to ::T
                     // but when reevaluated is Y::T
    typedef long T;
    T b;
};

因此,你问题中的代码确实是格式良好的。