参考:复制省略
这仅适用于已知正在初始化的对象不是潜在重叠子对象的情况:
struct C { /* ... */ };
C f();
struct D;
D g();
struct D : C
{
D() : C(f()) {} // no elision when initializing a base-class subobject
D(int) : D(g()) {} // no elision because the D object being initialized might
// be a base-class subobject of some other class
};
如果编译器可以确定非重叠对象(例如主要数据类型)的内存布局以消除复制并在其目标处构造对象,那么为什么它不能对重叠对象执行相同的操作?系统级别的限制是什么,使编译器无法执行此类复制省略?
蒂亚
为什么它不能对重叠的对象做同样的事情?
因为物体的大小会是错误的。如果是
D() : C(f()) {}
sizeof(D)
可以大于 sizeof(C)
,如果是,则无法删除基类,因为删除的基础对象中没有派生部分的空间。
与
D(int) : D(g()) {}
从另一个方向你也会得到同样的结果。如果
D
是另一个对象的基类,那么省略 D(g())
将意味着实际创建的对象是
D
,而不是继承它的任何东西,如果它比你大就有麻烦了。