2012-04-13 46 views
3

VS2010的unique_ptr在内部向量结构当矢量

用于调整大小我有具有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 &)。我不明白为什么调整大小的操作需要调用这些函数(为什么它只是在需要时调用默认构造函数?)。他们都提出了问题,因为由于const而导致无法使用unique_ptr

回答

6

我讨厌打断你与你的谈话。 :-)

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

+0

我很欣赏中断! :-)我从来不会猜测问题是V10(现在是VC11)不执行'noexcept'。 http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx – dsmtoday 2012-04-15 04:12:13

0

答案(其中写出,并张贴导致答案的问题另一种情况),当然,是​​没有拷贝语义。即使如此,我仍然可以使用上述安排,直到我需要拨打resize()。我没有想到的是,resize()可能需要将块和项目移动到另一个内存块。那是复制发生的时候。尽管它只是非常临时的,但它在复制过程中仍然违反​​的唯一性。

让我更困惑的是,由于​​没有复制语义,因此vector<unique_ptr<>>也不应该有效。但答案必须是为这种情况编写模板专业化。

我大概可以写一个vector<Test>的模板专门化,以避免默认情况下,延迟复制矢量类,从而避免上述编译器错误。但是我使用这个结构并不需要性能,所以使用shared_ptr<>和它的复制语义来完成我所需要的一切。