gpt4 book ai didi

c++ - 5 与 std::move(5) 的行为差异

转载 作者:行者123 更新时间:2023-11-30 03:30:11 24 4
gpt4 key购买 nike

我已经阅读了关于不同值类别的所有主要问题,但仍然不清楚在这种情况下 xvalues 与 prvalues 之间的区别。

我知道,像所有的泛左值一样,xvalues 的动态类型可以不同于静态类型,但是例如在文字与 std::move 从文字的情况下,我找不到“真正的”行为差异(可能除了那些正式基于什么是 xvalue 和什么是 prvalue 的差异,比如将调用哪个构造函数在 MyClass(std::move(5)); 中,但它在文字的情况下似乎并不重要,因为它们的值无论如何都不会被使用。

通过对文字调用 std::move 我可以获得什么实际“好处”?

最佳答案

What is the actual 'benefit' I can get from calling std::move on a literal?

没有。 (非字符串)文字是纯右值,它是右值。调用 std::move() 将为您提供一个 xvalue,但它仍然是一个 rvalue。没有办法重载 xvalue 和 prvalue 之间的差异 - 你只能重载 lvalue 和 rvalue 之间的差异 - 所以没有后续差异。

但是,如果我们概括为对纯右值调用 std::move,就会有一个很大的反面好处:在某些可能需要的地方,您会失去临时的生命周期延长。考虑:

SomeContainer foo();
for (auto&& elem : foo()) { ... }

这很好用。您可以像那样迭代纯右值。但是,这根本不起作用:

SomeContainer foo();
for (auto&& elem : std::move(foo())) { ... }

我们仍然有一个 SomeContainer 类型的右值,但是现在我们的临时对象绑定(bind)到 move() 的引用参数,所以它在进入 for 循环体之前超出范围。糟糕。

关于c++ - 5 与 std::move(5) 的行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45190696/

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