gpt4 book ai didi

c++ - 如果右值引用确实需要 std::move,我们应该何时声明它们?

转载 作者:行者123 更新时间:2023-12-01 14:49:42 24 4
gpt4 key购买 nike

正如许多其他帖子所解释的那样,将一个变量声明为右值引用确实 不是 保证它将调用 move 赋值运算符,仅使用 std::move (也就是说,转换为相同的右值引用)会做到这一点。例如:

struct A
{
A& operator=(A&& l_other) { std::cout << "move" << std::endl; }
A& operator=(A& l_other) { std::cout << "copy" << std::endl; }
};

A a;

// does not print anything, compiler does nothing here!
A&& b = std::move(a);

// prints "copy", not "move"
a = b;

// prints "move", but needs std::move()
a = std::move(b);

似乎定义 bA&&在那一刻没有 move 任何东西。之后, a = b不动 b自动,即使右侧部分定义为 A&& ,正如其他帖子所解释的那样。我们需要显式调用 std::move(b)搬家 b .

我的问题是, 将变量定义为 A&& 有什么用处? ? 我可以完美地将其定义为 A&并 move 它完全相同。

最佳答案

My question is, what's the utility of defining a variable as A&&? I could perfectly define it as A& and move it exactly the same.



如果将命名变量传递给函数并像这样在没有警告的情况下进行修改,那将非常令人不快,并且可能导致令人不快的调试 session 。

当您通过右值引用获取时,类型系统会强制执行有用的保证。引用绑定(bind)到一个右值,因此修改它不会违反任何人的假设(无论如何它很快就会消失)。或者你被明确允许搬出它。调用上下文不会意外地授予您修改左值的权限,它必须使用显式强制转换 ( std::move) 进行。

显式优于隐式。并且让右值引用以它们的方式与类型系统交互有助于确保 move 不会使对象处于意外状态。看一眼调用上下文就会发现,传递给函数的变量可能处于未知状态,因为它被显式地调用了 std::move。 .

这就是右值引用的好处。

关于c++ - 如果右值引用确实需要 std::move,我们应该何时声明它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58854278/

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