根据这个问题的广受认可的答案(rvalue引用允许悬空引用吗?),似乎像问题中那样将xvalues分配给rvalue引用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
函数返回的对象的生命周期被延长,尽管根据http://en.cppreference.com/w/cpp/language/value_category(xvalues解释中的第三个符号表示我上面访问成员所使用的是xvalue)make_something().a
是一个 xvalue。
如果值类别不能决定 rvalue 的生命周期何时被延长,那么是什么决定呢?我很难理解 C++ 中 rvalue 何时会被延长生命周期。a.m 表示对象表达式的成员,其中 a 是一个 rvalue,m 是非引用类型的非静态数据成员。
std::move()
不会延长引用的生命周期。 - Curiousstd::move()
的结果不被视为“临时变量”,因此其生命周期不会延长。xvalues可以像我在上面的问题中一样成为“临时变量”。 - Curiousmove
函数的返回值是一个引用,而不是一个对象。请注意,该引用所绑定的对象可能会在其他地方声明并分配内存。 - Nicol Bolas