我有一个创建并返回一个对象的函数。它还有一个副作用,将成功标志写入布尔变量:
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
或者其他什么?
(My struct
不是 POD,如果这很重要的话)
编写该标准的人已经想到了这种情况,坏消息是它被禁止了:
12.7 构建和销毁
1 - 对于具有非平凡构造函数的对象,在构造函数开始执行之前引用该对象的任何非静态成员或基类会导致未定义的行为。 [...]
给出的示例与您的代码非常接近:
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
}
};
在这种情况下,未定义的行为正在形成一个指向尚未构造的成员的成员的指针;形成对成员的引用非常相似。
我认为很明显,为了将引用传递到构造函数中,您必须获取引用(对象的成员)在构造函数开始执行之前.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)