重新排序会员声明

时间:2014-05-20 11:16:06

标签: c++ class

C ++标准中引用了3.3.7 / 1:

  

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

这是什么意思?你能得到一个这样的重新排序 declrartion的例子吗?

2 个答案:

答案 0 :(得分:3)

考虑这个程序:

double foo;
class Bar {
    std::vector<decltype(foo)> v;
    int foo;
};

重新排序 Bar::vBar::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中,任何编译器都将提供正确的代码。 所以这就是你需要的例子。