在 clang 和 g++ 中对类成员进行重新排序

Reordering of the class members in clang and g++

本文关键字:新排序 排序 成员 clang g++      更新时间:2023-10-16

程序

#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++

是他们的错误吗?

如果对类中的成员声明重新排序会产生备用有效 (1) 和 (2) 下的程序,程序格式不正确,否 需要诊断。

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

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

程序不符合规则 2):

2) 类S中使用的名称N应指同一声明 在其上下文中以及在已完成的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;
};

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