gpt4 book ai didi

c++ - 将 std::vector 传递给构造函数并移动语义

转载 作者:可可西里 更新时间:2023-11-01 14:55:10 26 4
gpt4 key购买 nike

周末我试图更新我的 c++ 技能并学习一些 c++11,我偶然发现了以下问题:我无法强制我的容器类正确使用移动构造函数:

我有一个生成器类,定义如下:

class builder
{
...
container build() const
{
std::vector<items> items;

//... fill up the vector

return container(items); //should move the vector right? wrong!
//return container(std::move(items)); also doesn't work
}
}

类item和container,定义如下:

class container
{
public:

container(std:vector<item> items)
: items_(items) // always invokes copy constructor on vector, never move
{ }

container(container&& rhs)
{
...
}

...

private:
std::vector<item> items_;

}

class item
{
public:
//move .ctor
item(item && rhs);
item& operator=(item && rhs);

//copy .ctor
item(const item& rhs); //this gets called instead of move .ctor
item& operator=(const item& rhs);

...
}

现在我的代码只是使用

builder my_builder;
...
auto result = my_builder.build();

这导致每个项目首先被构建然后被复制...

我应该如何编写以下类才能不复制项目?我应该回到使用标准指针吗?

最佳答案

您的代码应更改为:

container(std:vector<item2> items) // may copy OR move
: items_(std::move(items)) // always moves
{}

一般而言:如果您想要自己的某物拷贝,请在该参数列表上制作该拷贝并将其移动到需要的位置。让调用者决定是否要复制或移动现有数据。 (换句话说,您已经完成了一半。现在只需移动您的数据即可。)

还有:return container(std::move(items));。我之前没有提到这个,因为我误以为所有局部变量都在return语句中自动移动,但只有返回值是。 (所以这实际上应该有效:return items;,因为container 的构造函数不是explicit。)

关于c++ - 将 std::vector 传递给构造函数并移动语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9963798/

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