【问题标题】:Proper way to implement move semantics for class with std::vector of std::vector member使用 std::vector 成员的 std::vector 为类实现移动语义的正确方法
【发布时间】:2011-11-25 23:09:09
【问题描述】:
我有一个类,它的成员是向量的向量。我想为这个类编写一个构造函数,它将对单个向量的 r 值引用作为参数,并将其作为向量参数的单个元素向量移动到成员向量中。到目前为止,我有:
class AClass
{
std::vector<std::vector<int>> member;
public:
AClass(std::vector<int> &&vec) : member(1)
{
member[0] = std::vector<int>(std::move(vec));
}
}
这似乎工作正常,但我不确定vec 周围的std::move 是否是必要的。或者如果我写的有点不同,std::vector 会为我处理很多事情。
【问题讨论】:
标签:
c++
c++11
stdvector
move-semantics
【解决方案1】:
应该写得更短:
member[0] = std::move(vec);
为了调用
vector<T,Allocator>& operator=(vector<T,Allocator>&& x);
据我所知,显式移动是必要的,因为vec 不是右值(它是一个命名变量,可以在operator= 的左侧使用)。
【解决方案2】:
现在这样做的方法就是将值按值传递给构造函数,然后将其移动到您想要的位置。所以
AClass(std::vector<int> vec)
{
member.emplace_back(std::move(vec));
}
你不需要关心这个值是否是复制构造的,或者它是否能够被移动到构造函数中,因为它是一个右值,或者其他什么。您只需在函数定义中请求获取您自己的项目副本,该语言会尽可能地为您提供。