移动std :: unique_ptr时出错

use*_*067 0 c++

我尝试运行此代码以在复制构造函数中将unique_ptr从第一个向量移动到另一个向量:

class Text
{
    struct paragraph
    {
        int index;
        string text;
    };

    vector<unique_ptr<paragraph>> paragraphs; 

public:

    Text()
    {
        paragraphs.push_back(unique_ptr<paragraph>(new paragraph));
    }

    Text(const Text & t)
    {
        for(int i = 0; i < (int)t.paragraphs.size(); i++)
        {
            paragraphs.push_back(move(t.paragraphs[i]));
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

1>c:\program files\microsoft visual studio 10.0\vc\include\xmemory(208): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
1>          with
1>          [
1>              _Ty=Text::paragraph
1>          ]
// Etc.
Run Code Online (Sandbox Code Playgroud)

Nic*_*las 5

你的代码有几个问题.

首先,你不能从a移动const&,这也适用于a的成员const&.运动是破坏性的; 你应该只从一个移动&&.您的复制构造函数应该复制 ; 如果您不想要复制构造函数,那么= delete它或编译器允许的任何内容.

其次,假设您选择了一个Test &&正确的移动构造函数,则不应该像这样移动每个元素.相反,将向量移动到新的向量中,如下所示:

Text(Text && t) : paragraphs(std::move(t.paragraphs)) {}
Run Code Online (Sandbox Code Playgroud)

第三,您应该只编写此函数,假设您选择的编译器不支持自动生成的移动构造函数(即:是Visual Studio).如果它支持它,你根本不应该写一个.让编译器完成它的工作.