C++ 通过成员函数将唯一ptr的向量追加到另一个
我想将一个惟一ptr向量移动到一个我存储在类中的惟一ptr向量。我已将其简化为以下示例:C++ 通过成员函数将唯一ptr的向量追加到另一个,c++,smart-pointers,unique-ptr,C++,Smart Pointers,Unique Ptr,我想将一个惟一ptr向量移动到一个我存储在类中的惟一ptr向量。我已将其简化为以下示例: #include <iostream> #include <memory> #include <vector> using namespace std; class A { public: A() = default; }; class B { public: void AddAs(const vector<unique_ptr<
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
class A
{
public:
A() = default;
};
class B
{
public:
void AddAs(const vector<unique_ptr<A>>& vv)
{
vec.insert(vec.end(),
std::make_move_iterator(vv.begin()),
std::make_move_iterator(vv.end())
);
}
vector<unique_ptr<A>> vec;
};
int main() {
vector<unique_ptr<A>> v;
for(int i=0; i<10; ++i)
{
v.push_back(make_unique<A>());
}
B b;
b.AddAs(v);
return 0;
}
#包括
#包括
#包括
使用名称空间std;
甲级
{
公众:
A()=默认值;
};
B类
{
公众:
void AddAs(const vector无法从通过const引用传递的向量移动,因为移动需要修改。因此将该方法更改为:
void AddAs(vector<unique_ptr<A>>&& vv)
这实际上很好,因为它向读者展示了向量将从中移动
@NicolBolas为什么删除左值引用?它不是真正可读的,但仍然会起作用。当然它会起作用。但给人们提供坏主意是个坏主意。从左值引用移动几乎总是错误的。这意味着,在调用函数的站点,没有迹象表明对象将被移动由于从对象移动会使其处于未定义状态,这意味着以后使用它是可疑的。防止这一点是std::move
和右值引用存在的主要原因。当然,另一个原因是不能将prvalues传递给左值引用参数。“这意味着,在调用该函数的站点上,没有迹象表明该对象将从中移动。"是的,但不幸的是,几乎所有传递左值引用的调用都是这种情况——方法假设要更改它,但调用站点上没有任何指示。但我不确定这是否是禁止传递左值引用的充分理由。函数是否会更改它和函数将从它移动。尽管后者是前者的子集,但后者是一个更具破坏性的过程。一般来说,完全销毁非常量
左值引用参数的内容是非常不礼貌的。而销毁对象的内容正是move所做的。
void AddAs(vector<unique_ptr<A>> vv)
b.AddAs(std::move(v));