如何解决为什么右值引用整数合法
关于C ++ 11,这可能是一个愚蠢的问题,但这确实困扰着我。
据我所知,右值引用也是一个引用,这意味着它将像引用一样将指向。
例如,
const int &ref = 1;
引用ref
指向纯右值1
,该值不可修改,这就是编译器强迫我们使用const
的原因。
另一个例子,
Bar&& GetBar()
{
Bar b;
return std::move(b);
}
此功能将返回悬空的引用,因为b
插入后return
被破坏了。
总而言之,右值引用是一个引用。
现在我很困惑。请检查以下代码:
int &&rref = 1;
如果右值引用也是一个引用,那么rref
现在指向指向纯右值1
,根据我的理解,该值不能编译,因为它可以编译,如果我执行rref = 2
怎么办?这是否意味着纯右值已更改:1
变为2
?
但是gcc告诉我它是可编译的...
为什么?为什么我们不需要const int &&rref = 1
?
解决方法
可以通过绑定到const左值引用或右值引用(自C ++ 11起)来延长临时对象的寿命,有关详细信息,请参见引用初始化。
带有指向其他详细信息的链接here
无论何时将引用绑定到临时对象或其子对象,临时对象的生存期都会延长以匹配引用的生存期,但以下情况除外:
然后继续列出一些例外,例如
与return语句中的函数的返回值绑定的临时绑定不会扩展:它会在return表达式的末尾立即销毁。这样的函数总是返回一个悬空的引用。
绑定到构造函数初始化器列表中的引用成员的临时绑定仅在构造函数退出之前一直存在,只要对象不存在即可。 (注意:从DR 1696开始,这种初始化是错误的)。 (直到C ++ 14)
在函数调用中包含引用参数的临时绑定一直存在,直到包含该函数调用的完整表达式的末尾为止:如果该函数返回的引用超出了完整表达式的使用寿命,则它将变为悬空引用。
与new表达式中使用的初始化程序中的引用的临时绑定一直存在,直到包含该new表达式的完整表达式的结尾为止,而不是与初始化对象一样长。如果初始化的对象的寿命超过了完整的表达式,则其引用成员将成为悬空引用。 (自C ++ 11起)
与使用列表初始化语法(花括号)相反的,使用直接初始化语法(括号)进行初始化的聚合的引用元素中的引用的临时绑定存在,直到包含初始化程序的完整表达式的末尾为止。 (自C ++ 20起)
那是为什么
const int &ref = 1;
有效,因为我们使用const
是不正确的。编译器实际上是在扩展临时对象的生存期,以匹配引用的生存期。因此,使用右值引用执行相同的操作同样有效。
另一方面
int &ref = 1;
没有意义,因为1
不是左值。这就是为什么我们需要const
或右值引用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。