gpt4 book ai didi

c++ - 在 C++ 中复制对未初始化对象的引用

转载 作者:行者123 更新时间:2023-11-28 01:44:08 24 4
gpt4 key购买 nike

根据c++标准,在初始化引用的对象之前复制引用是否是未定义行为?这发生在下面的例子中,我传递了一个对父类的引用,然后才初始化对象的值,因为对父构造函数的调用必须在初始化列表中排在第一位。

#include <iostream>

struct Object
{
int val;
Object(int i): val(i) {}
};

struct Parent
{
Object& ref;
Parent(Object& i): ref(i){}
};

struct Child : Parent
{
Object obj;
Child(int i): Parent(obj), obj(i) {}
};

int main()
{
std::cout << Child(3).ref.val;
}

这里用Parent(obj)初始化Parent时,obj的值还没有初始化。

这在 gcc 下编译得很好,我确实得到了正确的输出,但我不确定标准或良好的编码实践是否建议反对它。这是未定义的行为吗?如果不是,这是我应该避免的不良做法吗?

最佳答案

首先,让我澄清一件事。我不确定是否有可能从字面上复制引用

int i = 10;
int& ref = i; // since this moment ref becomes "untouchable"
int& alt_ref = ref; // actually, means int& alt_ref = i;

我认为如果 ref 是某个类的成员并且您复制此类的实例,也会发生同样的情况。此外,如果您仔细观察您的代码,您甚至不会“复制引用”,而是使用未初始化(尚未)的对象来初始化引用。

struct Parent 
{
Object& ref;
Parent(Object& i): ref(i) { }
};

struct Child : Parent
{
Object obj;
Child(int i): Parent(obj), obj(i) { }
};

物理上等同于:

struct Child
{
Object& ref;
Object obj;
Child(int i): ref(obj), obj(i) { }
};

话虽如此,您的问题实际上意味着:

Is it undefined behavior to initialize a reference before initializing the object it is about to refer?

这里引用 C++ 标准 (§3.8.6 [basic.life/6]) 可能给出的答案:

Similarly, before the lifetime of an object has started but after the storage which the object will occupy has been allocated or, after the lifetime of an object has ended and before the storage which the object occupied is reused or released, any glvalue that refers to the original object may be used but only in limited ways. For an object under construction or destruction, see 12.7. Otherwise, such a glvalue refers to allocated storage (3.7.4.2), and using the properties of the glvalue that do not depend on its value is well-defined.

而 §12.7.1 [class.cdtor/1] 只是说:

...referring to any non-static member or base class of the object before the constructor begins execution results in undefined behavior.

§12.7.1 仅提及“引用对象成员”,因此“引用对象自身”属于§3.8.6。这样,我得出的结论是,引用未初始化(但已分配)的对象是明确定义的。

如果您发现任何错误,请在评论中告诉我。也可以随意编辑此答案。

编辑:我只想说,这样的结论似乎是有道理的。对象的初始化不能改变它在内存中的位置。在初始化之前存储对已分配内存的引用有什么不好?

关于c++ - 在 C++ 中复制对未初始化对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45902829/

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