gpt4 book ai didi

c++ - 通过基引用进行分配的对象切片是否定义明确?

转载 作者:行者123 更新时间:2023-12-02 09:49:27 30 4
gpt4 key购买 nike

通过基类引用(没有虚拟 operator= )分配派生对象时发生的对象切片是定义明确的操作吗?即,标准是否保证不触及对象的派生部分?

在此处和其他地方有关对象切片的许多问题中,给出了如下示例:

struct Base{
int x;
Base(int xx) :x(xx) {}
virtual void print() const {std::cout << "Base("<<x<<")\n";}
};

struct Derived : Base{
int y;
Derived(int xx, int yy ) :Base(xx),y(yy){}
void print() const {std::cout << "Derived("<<x<<","<<y<<")\n";}
};

int main()
{
Derived d1{1,2};
Derived d2{3,4};

Base& br = d1;
br = d2; // assign a Derived through a Base&

br.print(); // prints Derived(3,2)
}

该示例旨在说明当通过 Base& 分配时它只分配 Base类(class)成员并将成员留在 Derived原封不动。

使用 -fsanitize=undefined 构建上述示例不会提示,它会在我运行它的所有系统上产生预期的输出。

问题是,这是否由标准保证?据我了解,如 Base::operator=不能在 Base 之外写入对象的一部分,以及 Derived对象的一部分(此处为 int y)不能与 Base 有任何重叠。部分。

我缺少一些极端情况吗? (当然,有很多方法有一个不一致的对象会导致未定义的行为,但我的问题仅限于赋值操作期间发生的事情。)

最佳答案

Base& br = d1;

这将创建对 Base 的引用目的。现在将引用 Base与任何其他 Base 一样格式良好的对象对象(在格式良好的 C++ 程序中)。在所有方面,引用的 Base对象与所有其他 Base 相同可能存在也可能不存在的对象。可以像任何其他 Base 一样分配此对象可以分配对象,并且该对象将发生与任何其他 Base 完全相同的事情分配给的对象。结束。

当仅通过这些对象的棱镜观察时,作为其他对象的基础对象的对象与不是的对象没有任何不同。它们本身就是结构良好的对象,并且与任何其他 Base 一样对象(这里忽略虚拟方法之类的东西)。这是 C++ 中的一个基本概念。

如果分配给 Base 对象突然“写入”其他地方,那将是相当不方便的。在这种情况下,用 C++ 完成任何事情都是相当困难的。当然,不用说总是可以重载 operator= ,然后天空才是极限。但是从实用的角度来说,只要 =运算符(operator)按照预期的方式工作,分配给 Base对象不会对不属于 Base 的任何内容执行任何操作目的。

关于c++ - 通过基引用进行分配的对象切片是否定义明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61457292/

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