Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 通过成员函数将唯一ptr的向量追加到另一个_C++_Smart Pointers_Unique Ptr - Fatal编程技术网

C++ 通过成员函数将唯一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<

我想将一个惟一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<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));