【问题标题】:unique_ptr in structure inside vector doesn't compile when resize used on vector向量内结构中的 unique_ptr 在向量上使用调整大小时无法编译
【发布时间】:2012-04-25 11:23:15
【问题描述】:

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 &amp;Test::operator =(const Test &amp;)Test::Test(const Test &amp;)。我不明白为什么调整大小操作需要调用这些函数中的任何一个(如果需要,它为什么不直接调用默认构造函数?)。它们都存在问题,因为由于const,无法使用unique_ptr

【问题讨论】:

    标签: c++ vector c++11 visual-c++-2010 unique-ptr


    【解决方案1】:

    我不想打断你和自己的谈话。 :-)

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

    【讨论】:

    【解决方案2】:

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

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

    更让我困惑的是,由于unique_ptr&lt;&gt; 没有复制语义,vector&lt;unique_ptr&lt;&gt;&gt; 也不应该工作。但答案肯定是已经为此案例编写了模板特化。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 2018-05-02
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      相关资源
      最近更新 更多