将RVALUE-REFERCON与VC 中的局部变量结合
Binding rvalue-reference to a local variable in VC++
我正在使用VC 2012运行以下代码:
#include <utility>
struct A
{
int* m_p;
A() { m_p = new int; }
~A() { delete m_p; }
A(const A& otherA)
{
m_p = new int;
// BOOM!
*m_p = *otherA.m_p;
}
};
A&& CreateA()
{
A a;
return std::move(a);
}
int _tmain(int argc, _TCHAR* argv[])
{
A a2 = CreateA();
return 0;
}
在创建A2 A复制CTOR期间被称为 - 崩溃,因为在CreateA()中创建的源对象已经被破坏。这是标准行为吗?这可以是编译器错误??
请注意,如果您将A2的类型从" A"更改为" const a&amp;"坠机并未发生 - 这加剧了怀疑它确实是一个错误。谁能为此阐明吗?
注意:我完全知道这不是RVALUE-REF的预期用法,并且此示例是人为的。只是希望更好地了解这种新型的行为。
查看代码中发生的情况:
-
CreateA()
称为 - 在功能内部,创建了类型
A
的局部变量。 - 您创建一个指向此局部变量的RVALUE参考
- 您返回此RVALUE参考
- 当您返回时,RVALUE参考指向的类型
A
的对象不在范围内,并被销毁 - 引用现在指向被摧毁的对象
- 您尝试将
a2
初始化为曾经存在的对象的副本
和...那行不通。您要复制的对象已经死了。未定义的行为。
不要那样做。:)
在C 中,引用不会影响引用对象的寿命。没有"我指着这个对象,所以你不能销毁它!
切勿将引用返回到本地对象。它不起作用,所以...只是不要做。
您无法访问其范围之外的本地变量。RVALUE参考不会改变这一点:它们仍然是参考。提出的代码具有未定义的行为,因为它返回对本地变量的引用,然后访问它。
不要返回rvalue参考。在绝大多数时间里,这很愚蠢。返回值:
A CreateA()
{
A a;
return a; // a move here is automatic
// unless you are using a compiler with outdated rules like MSVC
//return std::move(a); // ok, poor MSVC
// alternatively:
//return A{}; //or
//return A();
}
编写A const& a2 = CreateA();
时,什么都没有崩溃,因为您实际上没有访问任何对象。您要做的就是抓住一个悬空的参考。但是,此代码甚至没有很好地构成,因为MSVC有一些过时的规则,可以进行编译。
因此,基本上,这些行为是编译器错误和未定义行为的混合:)
相关文章:
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 返回对局部变量 - C++ 的引用
- 是否可以影响 C++ 中回调函数的局部变量?
- 警告 C4101 未引用的局部变量
- 将RVALUE-REFERCON与VC 中的局部变量结合