C++ 类中成员声明的重新排序规则

C++ 类中成员声明的重新排序规则,c++,class,C++,Class,我正在阅读c++14 N3797,遇到了3.3.7/1: 如果对类中的成员声明进行重新排序,则会生成另一个有效的 (1)和(2)项下的程序,程序格式不正确,没有诊断 必需的 有(1)和(2): 1) 类中声明的名称的潜在作用域不仅包括 名称的声明点之后的声明性区域, 还有所有函数体,默认参数, 例外规范,以及 该类中的非静态数据成员(包括嵌套 课程) 2) 类S中使用的名称N应引用中的相同声明 其上下文以及在第 违反此规则需要进行诊断 如果我们写下以下内容: class A { int

我正在阅读c++14 N3797,遇到了3.3.7/1:

如果对类中的成员声明进行重新排序,则会生成另一个有效的 (1)和(2)项下的程序,程序格式不正确,没有诊断 必需的

有(1)和(2):

1) 类中声明的名称的潜在作用域不仅包括 名称的声明点之后的声明性区域, 还有所有函数体,默认参数, 例外规范,以及 该类中的非静态数据成员(包括嵌套 课程)

2) 类S中使用的名称N应引用中的相同声明 其上下文以及在第 违反此规则需要进行诊断

如果我们写下以下内容:

class A
{
    int a;
    int b;
}
那么这个程序的格式就不好了。重新排列成员声明将生成一个备用有效程序:

class A
{
    int b;
    int a;
}
我可能没有正确理解这条规则吗?

替代有效程序”指的是这样一种情况,即类中元素的每个顺序都会产生对程序的有效解释,但其含义会根据顺序而变化

在您的情况下,允许更改
a
b
的顺序,但由于它们的相对顺序不会影响程序的含义,因此定义了行为

要实现这一点,必须在类中使用一个名称,该名称已在类外定义了其他含义。例如:

typedef void *T;

struct whatever {
    T a;
    typedef long T;
};
这里,
a
声明的相对顺序和
T
的typedef影响代码的含义。正如现在所写的,
a
具有type
void*
,因为全局
typedef void*Tta时,code>在范围内被解析

但是,如果我们重新安排了这两种情况:

typedef void *T;

struct whatever {
    typedef long T;
    T a;
};

.
ta
相当于
长a。由于两个声明的相对顺序,程序的含义不同,因此行为未定义。

这肯定不会创建另一个有效程序。它可能看起来不一样,但编译和执行起来是一样的。你能举个例子说明它的顺序什么时候会影响程序的意义吗?看来我开始明白了。在这种情况下,重新排序前后的行为可能会有所不同,这是原则。我理解正确吗?是的。我添加了一个例子。如果(&whater::a<&whater::b)
这样的代码会被认为是受影响的,还是会得到修复并给出预期的结果?@chris:我想你可以将其解释为在上面的引用范围内,但我认为不打算涵盖它。真正的意图是,正如我上面所示,当您更改声明的顺序时,程序的基本含义(例如
T
所引用的类型)会发生变化。如果您包含了在更改顺序时更改的成员(可能)的地址,那么它会说基本上每个具有多个非静态数据成员的结构/类都有UB,我很确定这不是有意的。