Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 来自另一个非静态的非静态成员初始值设定项_C++_Gcc_C++11_Clang_Icc - Fatal编程技术网

C++ 来自另一个非静态的非静态成员初始值设定项

C++ 来自另一个非静态的非静态成员初始值设定项,c++,gcc,c++11,clang,icc,C++,Gcc,C++11,Clang,Icc,非常简单的问题。这是有效的C++11吗 struct Foo { int bar = 1; int baz = bar; }; GCC(4.7.2)和Clang(3.1)都接受学究式设置: -std=c++11 -Wall -W -pedantic 谁是对的 如果您想知道,我将此代码用于这样的代码,它使初始化代码更紧密地结合在一起,而不是将最后一行移到构造函数中: uint8_t colorR = -1; uint8_t colorG = -1; uint8_t colorB

非常简单的问题。这是有效的C++11吗

struct Foo {
    int bar = 1;
    int baz = bar;
};
GCC(4.7.2)和Clang(3.1)都接受学究式设置:

-std=c++11 -Wall -W -pedantic 谁是对的

如果您想知道,我将此代码用于这样的代码,它使初始化代码更紧密地结合在一起,而不是将最后一行移到构造函数中:

uint8_t colorR = -1;
uint8_t colorG = -1;
uint8_t colorB = -1;
uint8_t colorA = -1;
GLubyte RGBAVec[4] = {colorR, colorG, colorB, colorA};
5.1p12表示类的非静态数据成员或非静态成员函数的id表达式只能 可用于:

  • 作为类成员访问(5.2.5)的一部分,其中对象表达式引用成员的类 或从该类派生的类,或
  • 形成指向构件(5.3.1)的指针,或
  • 在该类或从该类派生的类(12.6.2)的构造函数的mem初始值设定项中,或
  • 在该类或从该类派生的类的非静态数据成员的大括号或相等初始值设定项中 类别(12.6.2),或
  • 如果该id表达式表示非静态数据成员,并且它出现在未计算的操作数中
是的,这是:

struct Foo {
  int bar = 1;
  int baz = bar;
};
是有效的C++11

但要注意秩序,因为:

12.6.2p10在非委托构造函数中,初始化按以下顺序进行:

  • 首先,并且仅对于派生最多的类(1.8)的构造函数,虚拟基类在 它们在基类的有向无环图的深度优先的从左到右遍历中出现的顺序, 其中“从左到右”是派生类基类说明符列表中基类的出现顺序
  • 然后,直接基类按照它们出现在基说明符列表中的声明顺序进行初始化 (无论mem初始值设定人的顺序如何)
  • 然后,按照类定义中声明的顺序初始化非静态数据成员 (同样,无论mem初始值设定者的顺序如何)
  • 最后,执行构造函数主体的复合语句
如(问题3)中所述:

第三个问题是类作用域查找可能会将编译时错误转化为运行时错误:

struct S {
    int i = j; // ill-formed without forward lookup, undefined behavior with
    int j = 3;
};
(除非被编译器捕获,否则i可能会被未定义的值j初始化。)


谢谢这看起来很确定。“或从该类派生的类”是什么意思?如何用派生类的成员初始化成员?派生类尚未声明,因此无法访问它。@Nikos C.“或从该类派生的类的”指的是“大括号或相等初始值设定项”,这意味着初始值设定项是dervied类中的一个。基本上,我认为这意味着您可以使用父类的非静态数据成员初始化非静态数据成员。与你理解它的方式相反,这更有意义:)
struct S {
    int i = j; // ill-formed without forward lookup, undefined behavior with
    int j = 3;
};