gpt4 book ai didi

c++ - 在带有初始化的声明中,我可以使用对未初始化数据的引用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:44 24 4
gpt4 key购买 nike

我有一个创建并返回对象的函数。它也有副作用,将成功标志写入 bool 变量:

struct MyObject
{
...
int field1;
char field2;
bool field3;
};

MyObject CreateMyObject(bool& success)
{
...
}

纯属巧合,我必须将成功标志存储在我的对象中。所以我可以用这种显而易见的方式来写它:

bool success;
MyObject x = CreateMyObject(success);
x.field3 = success;

或者这样:

MyObject x = CreateMyObject(x.field3);

第二种方式是否涉及未定义的行为,从多个赋值到 field3 或其他?

(我的 struct 不是 POD,如果这很重要的话)

最佳答案

写标准的人已经想到了这个案例,坏消息是它是被禁止的:

12.7 Construction and destruction

1 - For an object with a non-trivial constructor, referring to any non-static member or base class of the object before the constructor begins execution results in undefined behavior. [...]

给出的示例非常接近您的代码:

struct W { int j; };
struct X : public virtual W { };
struct Y {
int *p;
X x;
Y() : p(&x.j) { // undefined, x is not yet constructed
}
};

在那种情况下,未定义的行为正在形成一个指向尚未构造的成员的指针;形成对成员的引用非常相似。

我认为很明显,为了将引用传递给您的构造函数,您必须在构造函数开始执行之前获取(对对象成员的)引用。 p>

关于c++ - 在带有初始化的声明中,我可以使用对未初始化数据的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22202672/

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