引用非初始化的对象
Reference to uninitialized object
在解释我要标记的问题之前,我知道给定的示例是不良代码。我已经在研究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
的操作数。
只要您不做上述任何事情,您就在清晰中。
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 对象初始化中是否允许指向此成员的指针?
- 对象初始化后在C++中显示 char 数组时的异常行为
- 为什么两种不同的对象初始化方式给出不同的输出
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- afxmem.cpp中的对象初始化差异
- 删除通过取消引用新对象初始化的对象
- 如何使用sregex_token_iterator对象初始化向量
- 关于默认构造函数,对象初始化/使用C++ OOP
- C++ 基元类型初始化与对象初始化
- 哪个函数负责C++全局范围内的类对象初始化?
- C++中构造函数的对象初始化出现问题
- 如何修复模板 BST 类的对象初始化
- 无法在 QML/C++ 中使用绑定对象初始化 UI
- 为什么参数可以在对象初始化时通过赋值运算符传递给构造函数?
- 类对象初始化的二维向量
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- 对象初始化
- 类对象初始化
- 使用从另一个类继承的类的对象初始化成员对象