C ++标准中引用了3.3.7 / 1:
如果在类中重新排序成员声明会产生备用有效 根据(1)和(2)的程序,该程序是不正确的,没有诊断 必需的。
这是什么意思?你能得到一个这样的重新排序 declrartion的例子吗?
答案 0 :(得分:3)
考虑这个程序:
double foo;
class Bar {
std::vector<decltype(foo)> v;
int foo;
};
重新排序 Bar::v
和Bar::foo
,如下所示:
double foo;
class Bar {
int foo;
std::vector<decltype(foo)> v;
};
会产生另外有效的替代程序,因此程序违反了引用的规则。
(一个版本)gcc选择在第一种情况下发出错误,但用第二种变体编译(“不需要诊断”)。
std::vector<decltype(::foo)> v;
和std::vector<decltype(Bar::foo)> v;
是有效的替代方案(后者只有在首先声明Bar::foo
时才有可能。)
答案 1 :(得分:0)
案例的一个例子是你可以在构造对象时得到的常见错误。 代码变体1和2说明了它。 代码变体1:
class C
{
C() : a1(0), a2(a1)
{
}
int a1;
int a2;
};
代码变体2:
class C
{
C() : a1(0), a2(a1)
{
}
int a2;
int a1;
};
请注意,在变体2中,a1和a2成员声明顺序为cahnged。好的编译器将在代码变量2上提供警告:“成员初始化不像声明顺序那样”。 问题是在代码变体2中程序行为是未定义的。有些编译器会生成代码,其中a2将初始化为0(例如我猜测的是Visual Studio编译器),有些将生成代码,其中a2值将是未定义的,而在代码变体1中,任何编译器都将提供正确的代码。 所以这就是你需要的例子。