延长具有右值引用的临时的生存期
Extension of the lifetime of a temporary with an rvalue reference
根据另一个答案,如果引用右值引用的表达式是 xvalue 表达式,则不会延长临时引用的生存期。由于 std::move
返回一个右值引用,因此调用它的表达式是一个 xvalue,因此以下内容会导致一个悬空引用:
int main()
{
std::string&& danger = std::move(get_string()); // dangling reference !
return 0;
}
没关系。std::move
在这里没有意义;它已经是一个右值。
但这就是我画空白的地方。这与将 xvalue 表达式作为参数传递、完全标准地使用std::move
和右值引用有何不同?
void foo(const std::string& val);
// More efficient foo for temporaries:
void foo(std::string&& val);
int main()
{
std::string s;
foo(std::move(s)); // Give up s for efficiency
return 0;
}
是否有针对右值引用参数的特殊规则,无论它是 prvalue 还是 xvalue,都可以延长临时参数的生存期?还是调用表达式std::move
只是一个 x值,因为我们传递给它的东西已经是一个右值?我不这么认为,因为它无论如何都会返回一个右值引用,这是一个 xvalue。我在这里很困惑。我想我错过了一些愚蠢的东西。
你的第二个例子不是传递对临时的引用,而是传递对变量 s
的引用,该引用一直持续到 main()
年底。
如果是(例如 foo(std::move(get_string()));
),则临时函数的生存期将持续到完整表达式结束 - 在函数返回之后。因此,在 foo
内使用它非常安全。只有当foo
存储指向其参数的引用/指针,并且其他东西稍后尝试使用它时,才会有危险。
这里不需要延长任何生命周期:所讨论的对象持续到 main
结束,也就是foo
结束之后。
相关文章:
- 指针引用的生存期(以 C++为单位)
- 对临时对象的Const引用不会延长其生存期
- 返回引用是否也会延长其生存期?
- 超出返回引用的单一实例生存期
- 右值引用的生存期
- 仅允许从对较长生存期值的引用进行隐式构造
- 有没有办法在对象上保留弱引用并控制其生存期
- 为什么常量引用不能延长通过函数传递的临时对象的生存期?
- 为什么 C++ 从推断的返回类型中去除引用限定符,为什么生存期延长不起作用?
- 成员重新值引用和对象生存期
- 对临时与指向临时及其生存期的指针的引用
- 延长具有右值引用的临时的生存期
- 传递给存储常量引用的成员的临时对象的生存期
- 临时绑定到引用参数的默认参数的生存期是多少
- 如何延长从访问器返回的右值引用的生存期
- 三元运算符和通过引用const延长临时对象的生存期
- 绑定到函数参数的引用是否会延长该临时参数的生存期
- 引用/intilializer_list的生存期
- 未扩展常量引用变量的生存期
- 引用相对于其目标的生存期