在初始评估列表中引用类成员是不确定的行为吗?
Is it undefined behavior to refer to class members in an initialiser list?
假设我有以下内容:
class A {
B member1;
C member2;
public:
A();
};
class B {
public:
C& ref_to_c;
B( C& ref_to_c );
};
class C {
...
};
b要求在其构造函数上提供对C的引用。如果A类提供C,则指定A的初始列表列表是合法的...
A() : member1( B( member2 ) ) {}
也就是说,构件2是否存在于初始列表阶段,还是此不确定的行为?
Intialization如下:
5初始化应按以下顺序进行:
- 首先,仅适用于最派生的类的构造函数 下面描述的是,虚拟基类应在 命令它们出现在深度最先进的左右遍历 基本类的定向无环图,其中"从左到右"是 派生类中基类名称的外观顺序 基本列表。
- 然后,直接基类应按声明顺序初始化 当它们出现在基本列表中时 mem-intializer)。
- 然后,非静态数据成员应按顺序初始化 他们在班级定义中被宣布(再次 mem-initializers的顺序)。
- 最后,执行构造函数的主体。[注意: 要求宣布令确保基础和成员 亚对象以初始化的相反顺序被破坏。]
基本上意味着member1
将始终在member2
之前初始化。因此,B
的构造函数将首先运行。即使您在A
的构造函数中以相反的顺序称呼它们:
A() : member2(foo), member1(bar) {}
it 不有所作为。现在,引用非初始化对象本身不是UB,但可以取决于B
的构造函数。您应该切换声明的顺序:
C member2;
B member1;
您正在编造包含对memebr2
的引用的member1
。尚未构建,但是编译器已经知道它的位置(因此可以提供参考)。
它将起作用,但是如果您尝试的话,将是ub,例如,在b ctor-中 - 以某种表达式访问 ref_to_c
值,因为该引用实际上是在使一个非初始化的内存混为一谈,这将在成员2构建过程中初始化,那将在以后发生。
在B Destructor中将存在同样的问题,在ref_to_c
之前将销毁member2
。
如果您在a中交换成员2和member1会更好,这样您将用构造的对象初始化参考,从而使所有可能的用法(定义)。
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 不确定如何装饰我的C++库代码以在 C 中使用
- 将另一个类的对象传递到当前类C++的构造函数中(不是成员初始化)
- C++功能泄漏内存,我是C++新手,不确定如何解决
- "错误 C0000:语法错误,令牌"<EOF>"处出现意外$end,并且不确定
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 为什么以下代码是不确定的?
- 编译错误:"lvalue required as left operand of assignment" 不确定原因
- Boost 绑定和"result_type":不是成员,对 c++03 友好
- 误用指针会产生分段错误。我仍然不确定如何纠正它
- 通过指向班级第一个成员的指针访问成员是不确定的行为吗?
- 不确定如何修复;非静态成员参考必须相对于特定对象
- 通过全球常数对静态数据成员的初始化会导致不确定的行为
- 在初始评估列表中引用类成员是不确定的行为吗?
- 类中成员变量的数量不确定?C++
- 在其成员函数返回之前,将对象删除是不确定的行为吗?
- 如果没有使用使用代码的链接,则对G 中的静态常规成员的不确定引用
- 如何使大小不确定的多维数组成为 c++ 中类的成员