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());

そして、仕様では、デフォルトで一度構築され、後者の2つの引数がデフォルトで呼び出されたときにT構築された時間をコピーします。n

C ++ 11では、これは次のように変更されました。

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

2番目のコンストラクターの仕様は変更されていません。しかし、最初はそうしました:それはデフォルトの構築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に割り当てます。valuen T

于 2012-07-28T16:31:53.577 に答える
0

vector要件の一部であるムーブ代入演算子を含めず、ムーブ コンストラクターのみを含めました。

于 2012-07-28T16:34:21.177 に答える