关于C++标准第12.7p3段,我有以下问题
In relation to the paragraph 12.7p3 in the C++ Standard, I have the following questions
-
本
12.7p3
条施加的限制避免了哪些具体问题(见下文段落第一部分(? -
在
12.7p3
所示的示例中(见下文(,为什么X(this)
被视为已定义?是因为X
不在路径E C D B A
吗?struct A { }; struct B : virtual A { }; struct C : B { }; struct D : virtual A { D(A*); }; struct X { X(A*); }; struct E : C, D, X { E() : D(this), // undefined: upcast from E* to A* // might use path E* - D* - A* // but D is not constructed // D((C*)this), // defined: // E* - C* defined because E() has started // and C* - A* defined because // C fully constructed X(this) { // defined: upon construction of X, // C/B/D/A sublattice is fully constructed } };
-
请在下面找到第
12.7p3
段的开头:
显式或隐式转换引用 指向直接或间接指针(引用(的 X 类对象 X的基类B,X的构造和所有构造 直接或间接得出的 从B开始,这些类的销毁应该 尚未完成,否则转换结果为 undefined 行为。
上面提到的所有直接和间接X
基础的集合不包括B
,因此下面的代码定义得很好,尽管Base
是Derived
的直接基础并且尚未开始,这是否正确?
struct Base{ Base(Base*); };
struct Derived : Base {
Derived() : Base(this) {};
};
这些问题与以下第12.7p3条施加的限制避免了哪些具体问题(见下文段落的第一部分(?
事实有关:在某些时候,必须为派生类初始化虚拟指针(指向虚拟表或虚拟基类(。这是在"初始化列表"期间(即,在构造函数体开始之前(发生的初始化,通常是在构造基类之后(例如,在构造基类 B 之后,为类 X 设置虚拟表指针和可能的虚拟基指针,然后初始化数据成员,然后构造函数的主体开始(。通常,在初始化这些指针之前执行向上转换将产生未定义的行为,因为无法对虚拟基执行所需的指针查找,或者未正确设置虚拟表指针以正确调用虚拟函数。
在 12.7p3 所示的示例中(见下文(,为什么 X(this( 被认为是定义的?是因为 X 不在路径 E C D B A 中吗?
因为基类构造函数是按照它们在类声明中出现的顺序(即 struct E : C, D, X {
(调用的。因为基类 C 和 D 都是构造的,所以它们的公共虚拟基类 A 当然也是构造的。而且由于X
不继承自类A
,这意味着此时在执行从类E
到类A
的转换时,存在一条完全构造且明确的路径。这就是为什么这条线是明确界定的。
我说上面提到的 X 的所有直接和间接基的集合不包括 B,因此下面的代码定义得很好,尽管 Base 是 Derived 的直接基并且尚未开始,这是否正确?
不确定我是否遵循您的解释,但我可以告诉您,您显示的代码没有明确定义。当通过强制Derived* this
来调用Base
的构造函数时Base*
,派生类中的基类对象尚未构造,因此,强制转换是未定义的。
此代码有意义的唯一方法是,如果层次结构中不涉及虚函数或虚拟基类,在这种情况下,将不需要此类代码,因为指向基类的this
指针已隐式发送到基类构造函数。
- 标准::enable_if 和标准::is_arithmetic 作为模板参数的问题
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- 关于标准::condition_variables的两个问题
- 标题与标准标题具有相同名称但大小写不同的问题
- 我有一个关于标准::矢量<shared_ptr>的问题
- 从标准输入读取多个类型时出现问题
- 复杂的标准::地图,结构,标准::d问题
- C++ 标准::矢量<int>问题
- 标准::enable_if的基本用法问题
- 关于实施标准::add_pointer的问题
- 标准::Ofstream Open的Klocwork问题
- 得到~对标准输出没有回应~在黑客排名问题上
- C++ 标准::字符串意外更改。我认为这个问题是关于深和浅拷贝的
- 标准容器的C 违反问题
- 关于"使用命名空间标准"的问题?
- 一些编码约定/标准实践问题
- 标准库的C 问题
- 标准::p空气分段构造函数中的可变参数模板问题
- 程序不输出正确的标准偏差.另外,验证问题
- C++ 标准库堆栈使用情况.推送浮点数组时出现问题