gpt4 book ai didi

c++ - 右值是否作为参数传递给函数内部的左值?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:44 25 4
gpt4 key购买 nike

我有一个 View 和一个 Shape 类,其中 View“拥有”它的 Shape 对象。我将其实现为 unique_ptr 的 vector 。在函数 View::add_shape(std::unique_ptr&& shape) 中,我仍然需要在右值参数上使用 std::move 使其编译。为什么? (使用 GCC 4.8)

#include <memory>
#include <vector>
using namespace std;

class Shape { };
class View
{
vector<unique_ptr<Shape>> m_shapes;
public:
void add_shape(unique_ptr<Shape>&& shape)
{
m_shapes.push_back(std::move(shape));// won't compile without the std::move
}
};


int main()
{
unique_ptr<Shape> ups(new Shape);
View v;
v.add_shape(std::move(ups));
}

最佳答案

是的,参数的右值引用仅用于从调用者的角度选择函数,它的行为类似于函数内部的左值引用。

原因是您只允许移动一个值一次,而且自动保持参数的右值性被认为太危险了。参数类型表示此函数接受右值并通过提供实际移动该值的实现来潜在地使用它。通过重载此版本的方法,可以使用有利于非移动版本。或者它只是说函数需要一个右值。

在函数的实现中会发生什么是另一回事。考虑像这样的方法

void add_shape_twice(unique_ptr<Shape>&& shape)
{
m_shapes.push_back(shape);
m_shapes.push_back(shape);
}

如果 shape 作为参数将保持右值引用:您可能不小心将值移动了两次。由于在现实世界中函数可能更长并且多次引用参数(显式或在循环或包扩展内)是很常见的,因此错误的可能性将是巨大的。

即使我们都知道它并且永远不会忘记它,这也意味着我们需要抛弃右值性,这会使代码非常笨拙。我们会不断添加和删除右值。

关于c++ - 右值是否作为参数传递给函数内部的左值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19062853/

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