gpt4 book ai didi

c++ - 使用右值引用延长临时对象的生命周期

转载 作者:可可西里 更新时间:2023-11-01 16:31:15 27 4
gpt4 key购买 nike

According to another answer , 如果引用它的表达式是一个 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;
}

右值引用参数是否有一条特殊规则可以延长临时对象的生命周期,无论它是纯右值还是缺值?或者 std::move 调用表达式只是一个 xvalue,因为我们传递给它的东西已经是一个右值?我不这么认为,因为它无论如何都会返回一个右值引用,它是一个 xvalue。我在这里很困惑。我想我错过了一些愚蠢的东西。

最佳答案

您的第二个示例没有传递对临时变量的引用,而是传递对变量 s 的引用,持续到 main() 结束.

如果是(例如 foo(std::move(get_string())); ),那么临时对象的生命周期将持续到完整表达式的末尾 - 在函数返回之后。因此在 foo 内使用它是相当安全的.如果 foo 只有危险存储指向它的参数的引用/指针,其他东西稍后会尝试使用它。

关于c++ - 使用右值引用延长临时对象的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13585285/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com