0

我尝试在复制构造函数中运行此代码以将 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]));
        }
    }
};

我得到了这个错误:

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.
4

2 回答 2

5

您的代码有几处问题。

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

其次,假设您采用Test &&了适当的移动构造函数,则不应像那样移动每个元素。相反,将向量移动到新的向量中,如下所示:

Text(Text && t) : paragraphs(std::move(t.paragraphs)) {}

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

于 2013-02-14T10:32:23.417 回答
0
Text(const Text & t)
{
    for(int i = 0; i < (int)t.paragraphs.size(); i++)
    {
        paragraphs.push_back(move(t.paragraphs[i]));
    }
}

在这个构造函数t中是 const,所以t.paragraphs[i]给 a 一个 const 左值引用unique_ptr

move(t.paragraphs[i])把它变成一个 const右值引用,但它仍然是 const。移动构造unique_ptr函数需要非常量右值引用,因此不可行,因此删除的复制构造函数是最佳匹配。您不应该尝试移动t复制构造函数中的内容,这就是移动构造函数的用途。

您还应该说不std::move只是move,以防止 ADL 找到错误的举动。

于 2013-02-14T10:33:17.240 回答