引用非初始化的对象

Reference to uninitialized object

本文关键字:对象 初始化 引用      更新时间:2023-10-16

在解释我要标记的问题之前,我知道给定的示例是不良代码。我已经在研究std::shared_ptr,以更合理的方式实现我的目标。这篇文章的原因只是我的好奇心和学习新知识的愿望。预先感谢您提供帮助!

我今天对我的解析器代码有些混乱。最佳化内容等。我专注于几个对象实例,这些实例不确定地克隆了整个解析。我没有太多的想法来创建很少的全局实例并通过静态方法访问它们。无论如何(非常简化(我以这个有趣的情况结束了:

class class_a
{
    class_a();
    class_a& referenceToObject;
};
class_a& getGlobalObject();
class_a::class_a()
:referenceToObject(getGlobalObject())
{}
class_a object;
class_a object2;
class_a& getGlobalObject()
{
    return object2;
}

这显然意味着我做了很多事情,但是在这个分支上,优化是最重要的事情。

我有兴趣在更广泛的编译器集合中发生的代码中会发生什么。GetGlobalObject()正在返回对未调用构造函数的对象的引用。它仍然仅返回参考 - 是在编译时间已知的内存上的空间(在数据段或堆上的某个地方(的指针。

假设什么都不会称呼任何方法或object2参考的任何成员,此示例是未定义的行为吗?

是的

[basic.life] ...同样,在对象的寿命开始之前,但是在对象将占用的存储后,或者在对象的寿命结束和对象的存储之前,被占用或释放的占用,任何指的glvalue都可以使用,但只能以有限的方式使用。有关正在建设或破坏的对象,请参见[class.cdtor]。否则,这种glvalue是指分配的存储([basic.stc.dynamic.salocation](,并且使用不依赖其值的glvalue的属性是明确定义的。该程序具有不确定的行为,如果:
(7.1(Glvalue用于访问对象,或者
(7.2(Glvalue用于调用对象的非静态成员函数,或者
(7.3(glvalue与虚拟基类([DCL.Init.ref](或
绑定 (7.4(Glvalue用作dynamic_­cast的操作数([Expr.dynamic.cast](或typeid的操作数。

只要您不做上述任何事情,您就在清晰中。