3

VS2010

我有一个unique_ptr内部结构。然后我有一个vector这样的结构。如果我尝试调整向量的大小(或使用保留),我会收到编译错误。下面是一个仍然存在问题的精简示例。

struct Test
{
    unique_ptr<int> pValue;
};

void test()
{
    // this doesn't compile
    vector<Test> testVector;
    testVector.resize(5);

    // this also doesn't compile
    testVector.reserve(5);

    // this, of course, compiles
    vector<unique_ptr<int>> testVector2;
    testVector2.resize(5);
    testVector2.reserve(5);
}

unique_ptr我得到的错误是关于访问(赋值运算符)的私有成员的抱怨。编译器正在尝试动态构造Test &Test::operator =(const Test &)Test::Test(const Test &)。我不明白为什么调整大小操作需要调用这些函数中的任何一个(如果需要,它为什么不直接调用默认构造函数?)。它们都存在问题,因为unique_ptr由于const.

4

2 回答 2

6

我讨厌打断你和自己的谈话。:-)

但答案是 VS2010 还没有完全实现 C++11 规范(这需要一些时间旅行)。 Test应该有一个默认的 noexcept 移动构造函数来调用unique_ptr移动构造函数。VS2010 没有实现这个隐式Test移动构造函数。如果是这样,您的完整示例将按预期编译和运行。 vector将使用 noexcept 移动构造函数在需要时移动东西。

于 2012-04-13T18:02:36.107 回答
0

(另一种写出并发布问题导致答案的情况)

答案当然是unique_ptr<>没有复制语义。即便如此,在我需要打电话之前,我都可以使用上述安排resize()。我没有想到的是,resize()可能必须将块和其中的项目移动到另一个内存块。这就是复制发生的时候。虽然只是极其暂时的,但还是违反unique_ptr<>了复制过程中的唯一性。

更让我困惑的是,既然unique_ptr<>没有复制语义,vector<unique_ptr<>>也不应该工作。但答案肯定是已经为这种情况编写了模板特化。

我可能也可以编写一个模板专业化,vector<Test>以避免默认情况下对向量类进行延迟复制,从而避免上述编译器错误。但是我对这个结构的使用不需要性能,所以让它shared_ptr<>与它的复制语义一起使用可以完成我需要的一切。

于 2012-04-13T12:03:11.323 回答