该计划
#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 ++都编译得很好
这是他们的错误吗?
答案 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;
};
因此,你问题中的代码确实是格式良好的。