将引用分配给新创建的堆栈分配对象时会发生什么
What happens when you assign a reference to a newly-created stack-allocated object?
在此代码中:
SomeClass& some_object = SomeClass();
some_object指的是什么?它有效吗?或者没有定义的行为?
根据标准这是无效的。然而,一些编译器(特别是MSVC)将允许它作为扩展。
允许给const引用赋值一个临时对象,这将导致该临时对象的生命周期延长到引用的生命周期:
{
const SomeClass& some_object = SomeClass();
// more code, some_object is valid
} //some_object is destructed here
这是无效的,因为不应该编译:
右值不能绑定到非const
左值引用。
然而,一些编译器,例如MSVC,允许将右值绑定到非const
左值引用,作为编译器的扩展。
根本无法编译。
非const引用(T&
)不允许绑定到临时对象。您可以将临时绑定到const T&
,或者从c++ 11开始绑定到T&&
,但是:
const SomeClass& obj = SomeClass();
SomeClass&& obj = SomeClass();
相关文章:
- 使用操作重载对象重新分配对象
- 静态分配对象的值初始化
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 堆分配对象中的堆栈对象在 c++ 中在哪里分配?
- 在 c++ 的构造函数中分配对象向量时出错
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 操作后通过运算符分配对象
- 如何捕获源自静态分配对象的构造函数的异常?
- 在C++中,当重新分配对象时,为什么构造函数在析构函数之前触发?
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 将动态分配对象传递到 boost::any 构造函数中
- 混合指向已分配对象和作用域对象的指针
- C 删除指向动态分配对象的指针
- 有关动态分配对象的问题
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- C++ 中的黑白堆分配对象和堆栈分配对象的性能差异
- 是隐式创建的默认构造函数,负责分配对象内存
- 如何删除用于动态分配对象的智能指针
- 分配对象数组时如何初始化每个对象
- 用于堆栈分配对象的C++虚拟析构函数内联