[英]Is it legal to use an rvalue reference of `std::future` as a parameter?
[英]Why is rvalue reference to an integer legal
这可能是一个关于 C++11 的愚蠢问题,但它确实困扰着我。
根据我的理解,右值引用也是一个引用,这意味着它会像引用一样指向某个变量。
例如,
const int &ref = 1;
引用ref
指向纯右值1
,无法修改,这就是编译器强制我们使用const
。
另一个例子,
Bar&& GetBar()
{
Bar b;
return std::move(b);
}
此函数将返回一个悬空引用,因为b
在return
ing 后被破坏。
总之,右值引用就是一个引用。
现在我很困惑。 请检查以下代码:
int &&rref = 1;
如果右值引用也是引用,那么rref
现在指向纯右值1
,按照我的理解,它不应该是可编译的,因为如果它是可编译的,那么如果我执行rref = 2
呢? 这是否意味着纯右值已更改: 1
变为2
?
但是 gcc 告诉我它是可编译的...
为什么? 为什么我们不需要const int &&rref = 1
?
来自cppreference的引用
临时对象的生命周期可以通过绑定到 const 左值引用或右值引用(C++11 起)来扩展,详情参见引用初始化。
此处提供其他详细信息的链接
每当引用绑定到临时对象或其子对象时,临时对象的生命周期都会延长以匹配引用的生命周期,但以下情况除外:
然后继续列出一些例外情况,例如
return 语句中函数返回值的临时绑定不会被扩展:它会在 return 表达式结束时立即销毁。 这样的函数总是返回一个悬空引用。
临时绑定到构造函数初始值设定项列表中的引用成员仅持续到构造函数退出,而不是只要对象存在。 (注意:从 DR 1696 开始,这种初始化格式不正确)。 (直到 C++14)
函数调用中引用参数的临时绑定一直存在,直到包含该函数调用的完整表达式结束:如果函数返回一个引用,该引用的生命周期超过完整表达式,则它成为悬空引用。
临时绑定到 new 表达式中使用的初始值设定项中的引用一直存在,直到包含该 new 表达式的完整表达式结束,而不是与初始化对象一样长。 如果初始化的对象比完整表达式的生命周期长,则其引用成员将成为悬空引用。 (C++11 起)
使用直接初始化语法(括号)而不是列表初始化语法(大括号)初始化的聚合的引用元素中的引用的临时绑定一直存在,直到包含初始化程序的完整表达式结束。 (C++20 起)
所以推理是
const int &ref = 1;
有效,因为我们使用const
是不正确的。 编译器实际上是在延长临时对象的生命周期以匹配引用的生命周期。 所以用右值引用做同样的事情同样有效。
另一方面
int &ref = 1;
没有意义,因为1
不是左值。 这就是我们需要const
或右值引用的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.