gpt4 book ai didi

c++ - 我们应该在何时、何地以及为什么使用 "BigObject&& rv = std::move(big_obj);"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:24 24 4
gpt4 key购买 nike

我的编译器是最新的 VC++ 2013 预览版。

#include <utility>

struct BigObject { ... };

void f(BigObject&&){}
void f(BigObject&) {}
void f(BigObject) {}

int main()
{
BigObject big_obj;

BigObject& r1 = big_obj; // OK.
BigObject&& r2 = big_obj; // error C2440
BigObject&& r3 = std::move(big_obj); // OK.
BigObject&& r4 = r3; // error C2440

f(r3); // error C2668: 'f' : ambiguous call to overloaded function
}

我们何时、何地以及为什么要使用 BigObject&& rv = std::move(big_obj);

最佳答案

我们何时、何地以及为什么要使用 BigObject&& rv = std::move(big_obj);

简答:从不,无处,原因如下:

所有命名变量表达式都是左值。所以它所做的是采用 big_obj,这是一个左值,将其强制转换为一个 xvalue,并使用它来初始化一个右值引用,该引用随后只能用作左值,然后我们回来了到我们开始的地方。这是一行完全无用的代码。

除了函数参数,定义局部右值引用通常不是很有用。不过,它们确实延长了用于初始化它们的临时对象的生命周期,因此它们可能会偶尔用于跨多个语句分隔复杂表达式。

值类别是表达式的属性,而不是引用的属性。您可以根据希望它能够绑定(bind)到的表达式的值类别来选择要使用的引用类型。并且您使用 std::move 强制调用某个函数的特定重载,否则它会调用错误的函数或产生歧义。

Bjarne 在 GoingNative2013 的问答环节中给出的建议基本上是,不要尝试将右值引用用于比移动构造函数和移动赋值运算符更“聪明”的东西。

来自 Herb Sutter:很多人认为移动意味着到处写 &&,但事实并非如此。您不需要自己编写 &&,除非您正在编写移动构造函数或移动赋值运算符,或者完美地转发函数模板中的参数。

关于c++ - 我们应该在何时、何地以及为什么使用 "BigObject&& rv = std::move(big_obj);"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18760668/

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