gpt4 book ai didi

c++ - 基类何时可以具有与相应的完整对象类型不同的布局?

转载 作者:IT老高 更新时间:2023-10-28 23:01:49 26 4
gpt4 key购买 nike

在调用基类构造函数时,GCC 和 Clang 不执行 C++17 的保证复制省略;见 this question和相应的Clang bug report了解详情。

针对错误报告,Richard Smith states :

This is a defect in the standard wording. Copy elision cannot be guaranteed when initializing a base class subobject, because base classes can have different layout than the corresponding complete object type.

在什么情况下,基类可以具有“与相应的完整对象类型不同的布局”,从而使得保证复制省略是不可能的?有没有具体的例子来说明这一点?

最佳答案

只要涉及到虚拟继承。

例子:

struct A {
int a;
A (int a) : a(a) {}
};

struct B: virtual A {
B() : A(0) {}
};


B makeB { return B(); }

struct C : B {
C() : B(makeB()), A(42) {}
};

C 构造函数初始化它的 A 子对象,所以 B 构造函数不能。 makeB 如何知道它是否应该初始化 A

在这种情况下,理论上仍然可以进行复制省略。实现需要透明地创建 makeB 的两个二进制版本,或者向 makeB 添加一个不可见的参数(即使用构造函数本身采用的技术),以便它可以使 B 有或没有初始化 A。然而,这似乎需要在 ABI 中进行不兼容的更改。

标准中可能有也可能没有缺陷。这种情况可能是委员会没有预见到的。如果是这样,我会很高兴阅读讨论,因为它肯定留下了纸上的痕迹。因此,在委员会作出澄清之前,其意图尚不清楚。如果打算在这种情况下要求复制省略,那么该死的 ABI 不兼容性,那么可能需要对标准进行进一步的更改(除非委员会已经预见到这种情况并确保一切都与它兼容,在这种情况下应该有一些又是一种纸迹)。

关于c++ - 基类何时可以具有与相应的完整对象类型不同的布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55274373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com