由右值引用引用的内存
Memory referenced by rvalue references
给定一个函数
int foo()
{
return 15;
}
可以使用
int&& ref = foo();
但不能使用:
int& ref = foo();
这是可以理解的,因为foo()
的返回值是一个rvalue
。然而,我如何能够使用以下内容?
#include <iostream>
template<typename T>
void f(T&& param)
{
param *= 2;
}
int foo()
{
return 15;
}
int test1()
{
int&& ref = foo();
std::cout << "ref = " << ref << std::endl;
f(ref);
std::cout << "ref = " << ref << std::endl;
}
int main()
{
test1();
return 0;
}
,输出如下,看起来很合理:<>之前Ref = 15Ref = 30之前
似乎ref
指向可写内存。行:
int&& ref = foo();
为ref
分配可写内存?
这个标准是否兼容?
使用g++ 4.8.2对代码进行了测试。
是的,该行为是定义良好的,因为通过将返回值绑定到右值引用,您已经扩展了临时对象的生命周期,以匹配它所绑定的引用的生命周期。
源自§12.2 [class.temporary]
4,在两种上下文中,临时变量在与完整表达式末尾不同的位置被销毁。
...
5 ,第二个上下文是当引用绑定到临时对象时。引用绑定到的临时对象或作为引用绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在,除了:...
(例外列表,没有一个适用于这种情况)
注意,生存期扩展规则只适用于右值,而不适用于xvalues(参考§12.2/1)。因此,如果您的示例执行了以下操作,那么您将拥有一个悬空引用:
int&& ref = std::move(foo());
相关文章:
- 对具有动态分配的内存和析构函数的类对象的引用
- 多个"常量引用"变量可以共享同一个内存吗?
- C++ 在类中使用常量引用文本时 O2 内存泄漏
- 常量引用的内存位置
- 引用释放的内存是未定义的行为吗?
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 垃圾回收正在移动内存中被引用的对象,破坏Unreal4引擎中的引用
- X 处的指令引用了 Y 处的内存.内存无法读取
- 按引用传递和动态内存分配之间的区别是什么
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 内存引用发送到双指针
- 可变引用以及指针如何与内存相互作用
- 通过引用 cpp 中的变量占用的内存
- C++中引用变量的内存?
- 来自引用指针的内存泄漏
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- Swift 3 引用类型和内存管理
- 数组是通过引用传递的,但是如果我只传递未存储在内存中的数组的值,会发生什么
- cpp 中的引用如何具有相同的内存地址
- 在递归循环中条件修改的引用内存