按照这个问题的公认答案,Do rvalue references allow dangling references?,当将x值分配给问题中的rvalue引用lvalue时,lvalue的生存期似乎没有延长。但是当我这么做的时候
#include <iostream>
using namespace std;
class Something {
public:
Something() {
cout << "Something()" << endl;
}
Something(const Something&) {
cout << "Something(const Something&)" << endl;
}
Something(Something&&) {
cout << "Something(Something&&)" << endl;
}
~Something() {
cout << "~Something()" << endl;
}
int a;
};
Something make_something() {
return Something{};
}
int main() {
auto&& something = make_something().a;
return 0;
}对make_something的调用返回的对象的生存期将被延长,即使make_something().a是category的xvalue ( xvalue解释中的第三个项目列出了我上面作为xvalue的成员访问权限,)
a.m,对象表达式的成员,其中a是rvalue,m是非引用类型的非静态数据成员;
如果值类别不确定rvalue的生存期何时延长,那么是什么?我很难理解rvalue的生存期是在C++中扩展的。
发布于 2017-02-24 15:02:08
生存期扩展不关心值类别。如stated .临时/p6所述:
绑定引用的临时对象或作为引用绑定的子对象的完整对象的临时对象,在引用的生存期内保持不变。
重点补充。
这里没有说明要引用的表达式的值类别。
决定一个临时的是否被扩展的正是上述(和一些更多的规则)。
但这并不能解释为什么在指定引用的临时对象周围添加
std::move()不会延长生存期。
std::move不是C++中一个神奇的编译器定义的构造。它是一个函数调用,因此它的行为与任何其他C++函数调用没有什么不同。
那么,如果你有std::move(Type()),这意味着什么?这意味着您将创建一个临时的,将其绑定到std::move的参数,然后调用该函数,这将返回一些东西。
将一个临时参数绑定到函数参数(如call .临时/p6中所述)意味着临时参数的生存期被固定为创建该参数的完整表达式的生存期(如果不是该规则,则必须在函数调用结束时销毁该临时参数,因为这是引用生命周期的结束)。
不管函数做什么、说什么或暗示什么,都不重要。编译器是否可以内联并确定返回值是对临时参数的引用并不重要。该临时的生存期是固定在表达式中,而不是延长的。
https://stackoverflow.com/questions/42441791
复制相似问题