第一个例子:
output:
result()创建了一个临时对象,它是一个右值,通过结果我们可以看到直到main函数结束时这个对象才调用了析构函数;
result()返回右值,我们的代码将这个右值绑定到了一个右值引用的变量r,这一行为(将右值绑定到右值引用的行为)延长了这个右值的生命周期到r变量的结束(也就是这里的main函数结束)。
第二个例子:
output:
即:result()创建的临时对象在16行结束后就销毁了------调用了析构函数。std::move()返回的是右值引用。我们前面提到:右值被绑定到一个右值引用后,前者生命周期得到延长,具体延长到和后者一样。但是我们这个例子是右值引用到右值引用的绑定,这并不会延长临时对象的生命周期,更让人头大的是,在16行结束,由于临时对象的析构,r 变量反而成了一个dangling ref(悬空引用),这可能会导致未定义行为。
第三个例子:
output:
同理,右值引用到const &依然不会延长临时对象的生命周期。
PS1:move返回右值引用。
这是move源码实现:
template <class _Ty>
_NODISCARD constexpr remove_reference_t<_Ty>&& move(_Ty&& _Arg) noexcept { // forward _Arg as movablereturn static_cast<remove_reference_t<_Ty>&&>(_Arg);
}
我们可以看到,static_cast将参数转化为了右值引用。