2

以下代码在下面(代码之后)生成编译器错误,但如果向量直接包含 unique_ptr 则不会(请参阅注释代码行)。任何想法为什么?

问题更关心“#if 1”块中的代码块,“#else”块产生的错误(将“#if 1”更改为“#if 0”后)类似,但更预期.

// MoveSemantics.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <memory>
#include <vector>

typedef std::unique_ptr<int> upi;

struct S
{
    S() : p(new int(123)) {}
    S(S&& s) : p( std::move(s.p) ) {} // NB: the move constructor is supposed to be used? (but not)
    upi p;
};

#if 1
void test()
{
    //std::vector<S> vs; // Okay
    //std::vector<upi> vupi(10); // Okay
    std::vector<S> vs(10); // Error! why in the hell does the compiler want to generate a copy constructor here??
}
#else
void test()
{
    std::vector<S> vs;

    vs.push_back( S() );
    const S& s = vs.front();
    //S& s = vs.front(); // fine!
    S s1 = std::move(s); // Error, but expected
}
#endif
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

编译器错误:

1> error C2248: 'std::unique_ptr<_Ty>::operator =' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
1>          with
1>          [
1>              _Ty=int
1>          ]
1>          c:\program files\microsoft visual studio 11.0\vc\include\memory(1435) : see declaration of 'std::unique_ptr<_Ty>::operator ='
1>          with
1>          [
1>              _Ty=int
1>          ]
1>          This diagnostic occurred in the compiler generated function 'S &S::operator =(const S &)'
4

2 回答 2

4

这看起来像是您的 std::lib 中的错误。我确信它之所以出现是因为vector规范不断发展的历史。

在 C++98/03vector中有这个构造函数:

explicit vector(size_type n, const T& value = T(), const Allocator& = Allocator());

规范是T默认构造一次,然后n在后两个参数默认调用时复制构造时间。

在 C++11 中,这变成了:

explicit vector(size_type n);
vector(size_type n, const T& value, const Allocator& = Allocator());

第二个构造函数的规范没有改变。但第一个做到了:它应该默认构建T n时间,而不是复制(或移动)它。

我本来希望错误消息说正在使用已删除或私有的复制构造函数。unique_ptr这表明它vector遵循 C++98/03 规范,只是还没有更新。

但是由于诊断程序抱怨unique_ptr的是 的复制分配,因此看起来vector已更新,但不正确。听起来它正在使用 C++98/03 中的这个签名:

explicit vector(size_type n, const T& value = T(), const Allocator& = Allocator());

和默认构造n T's,然后分配value给那些n T's。

于 2012-07-28T16:31:53.577 回答
0

您没有包含移动赋值运算符,这是vector要求的一部分,仅包含移动构造函数。

于 2012-07-28T16:34:21.177 回答