重新排序成员声明 < C++ >标准中的3.3.7/1的引用:

重新排序成员声明 < C++ >标准中的3.3.7/1的引用:,c++,class,C++,Class,如果对类中的成员声明进行重新排序,则会生成另一个有效的 (1)和(2)项下的程序,程序格式不正确,没有诊断 必需的 这是什么意思?你能得到这样一个重新排序的例子吗?这种情况的一个例子是在对象构造时可以得到的常见错误。 代码变体1和2说明了这一点。 代码变体1: class C { C() : a1(0), a2(a1) { } int a1; int a2; }; 代码变体2: class C { C() : a1(0), a2(a1) { } int

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


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

这种情况的一个例子是在对象构造时可以得到的常见错误。 代码变体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成员的声明顺序是固定的。好的编译器将在代码变体2上提供警告:“成员初始化与声明顺序不同”。 问题在于,在代码变体2中,程序行为未定义。有些编译器将生成a2将用0初始化的代码(据我猜测,例如Visual Studio编译器),有些编译器将生成a2值未定义的代码,而在代码变体1中,任何编译器都将提供正确的代码。
这就是你需要的例子。

这种情况的一个例子是你在构建对象时会遇到的常见错误。 代码变体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成员的声明顺序是固定的。好的编译器将在代码变体2上提供警告:“成员初始化与声明顺序不同”。 问题在于,在代码变体2中,程序行为未定义。有些编译器将生成a2将用0初始化的代码(据我猜测,例如Visual Studio编译器),有些编译器将生成a2值未定义的代码,而在代码变体1中,任何编译器都将提供正确的代码。
这就是你需要的例子。

这种情况的一个例子是你在构建对象时会遇到的常见错误。 代码变体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成员的声明顺序是固定的。好的编译器将在代码变体2上提供警告:“成员初始化与声明顺序不同”。 问题在于,在代码变体2中,程序行为未定义。有些编译器将生成a2将用0初始化的代码(据我猜测,例如Visual Studio编译器),有些编译器将生成a2值未定义的代码,而在代码变体1中,任何编译器都将提供正确的代码。
这就是你需要的例子。

这种情况的一个例子是你在构建对象时会遇到的常见错误。 代码变体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成员的声明顺序是固定的。好的编译器将在代码变体2上提供警告:“成员初始化与声明顺序不同”。 问题在于,在代码变体2中,程序行为未定义。有些编译器将生成a2将用0初始化的代码(据我猜测,例如Visual Studio编译器),有些编译器将生成a2值未定义的代码,而在代码变体1中,任何编译器都将提供正确的代码。 因此,这就是您需要的示例。

考虑以下程序:

double foo;
class Bar {
    std::vector<decltype(foo)> v;
    int foo;
};
将生成一个在其他方面有效的替代程序,因此该程序违反了引用的规则

(的一个版本)gcc选择在第一种情况下发出错误,但使用第二种变体编译(“无需诊断”)

std::vector v
std::vector v是有效的替代方案(后者只有在首先声明
Bar::foo
时才可能出现)。

考虑以下程序:

double foo;
class Bar {
    std::vector<decltype(foo)> v;
    int foo;
};
将生成一个在其他方面有效的替代程序,因此该程序违反了引用的规则

(的一个版本)gcc选择在第一种情况下发出错误,但使用第二种变体编译(“无需诊断”)

std::vector v
std::vector v是有效的替代方案(后者只有在首先声明
Bar::foo
时才可能出现)。

考虑以下程序:

double foo;
class Bar {
    std::vector<decltype(foo)> v;
    int foo;
};
将生成一个在其他方面有效的替代程序,因此该程序违反了引用的规则

(的一个版本)gcc选择在第一种情况下发出错误,但使用第二种变体编译(“无需诊断”)

std::vector v
std::vector v是有效的替代方案(后者只有在首先声明
Bar::foo
时才可能出现)。

考虑以下程序:

double foo;
class Bar {
    std::vector<decltype(foo)> v;
    int foo;
};
将生成一个在其他方面有效的替代程序,因此该程序违反了引用的规则

(的一个版本)gcc选择在第一种情况下发出错误,但使用第二种变体编译(“无需诊断”)


std::vector v
std::vector v
是有效的替代方案(后者只有在首先声明
Bar::foo
时才可能出现)。

成员声明顺序重要的一个实例是构造。初始化值时,您可能会初始化一个依赖于另一个的值。如果类中的顺序错误,则可能初始化得太早(在初始化其他成员之前)。成员声明顺序起作用的一个实例是构造。初始化值时,您可能会初始化一个依赖于另一个的值。如果类中的顺序错误,则可能初始化得太早(在初始化其他成员之前)。成员声明顺序起作用的一个实例是构造。初始化值时,您可能会初始化一个依赖于另一个的值。如果类中的顺序错误,则可能初始化得太早(在初始化其他成员之前)。成员声明顺序起作用的一个实例是构造。初始化值时,您可能会初始化一个依赖于另一个的值。如果类中的顺序错误,则可能初始化得太早(在初始化其他成员之前)