2016-04-01 9 views
6

vector<int>(v1)式はoperator=の右側に置くことができますが、vector<int>(v1)式を文として使用すると失敗しますVisual Studio 2010 10.0.30319.1 RTMRel。詳細なエラー情報は、次のコードのコメントにあります。なぜこれが起こるのですか?、チャプター82 「本当に能力を縮小し、実際に要素を消去するために受け入れられたイディオムを使用する」:本「101のルール、ガイドライン、およびベストプラクティスC++コーディング規約」になぜ文(v1);が失敗する

vector<int> v1; 
v1.push_back(10); 
v1.push_back(20); 
v1.push_back(30);  
vector<int> v3 = vector<int>(v1); //OK, deliberately code like this. 
vector<int>(v1); //error C2086: “std::vector<_Ty> v1”: redefinition 

。声明があります:

container<_Type>(c).swap(c); 

私は理解し、ちょうどcontainer<_Type>(c)をテストする必要はありませんが、それは何を意味するのでしょうか?

+0

コード行の前に4つのスペースを入れてコードとしてマークし、改行を追加してください(@ Yu Haoはあなたの現在の投稿を編集しました)ので、 – Thomas

+0

"あなたはそれをしたいのですか?達成したいのは何ですか? –

+0

なぜそれが有効な声明だと思いますか?どのような効果が期待されますか? – kfsone

答えて

1

を削除することが好ましい私はvector<int>(v1)は直観に反していることを理解し、私はそれを使用してのポイントが表示されていません。他の人が指摘しているように、これは標準的な動作です。「私は理解していないcontainer<_Type>(c).swap(c); ...」これはcontainer<_Type>(c);異なっている:

vector<int>::vector(v1); 
vector<int> { v1 }; 

EDIT(質問が変更されました):あなたが解決策を探しているなら、ここに2つの回避策です。コンテナの容量は、sizereserve参照)より大きい場合があります。予約は、いくつかの操作の数を最小限に抑えるのに役立ちます。新しい要素を追加すると、コンテナは既に割り当てられたメモリを使用します。例えば、あなたのベクトルは10要素のための部屋を持っているかもしれませんが、実際には1しかありません。新しい要素を追加すると、8要素のための部屋が残されます。上記の構成は、メモリを節約するために予備を削除します。最初にオリジナルのコピーが作成されます(このコピーには予約がありません)。次に、元のベクトルの基礎となるデータ(ポインタ)が新しいベクトルで置き換えられ(swap参照)、一時オブジェクト(現在は元のメモリを所有する)は破棄されます。

"... container<_Type>(c)をテストするにはどういう意味ですか?"上記のように使用すると、"cの一時的なコピーを作成"を意味します。孤立して使用されると、コピーコンストラクタのように見えますが、実際にはオブジェクトを宣言します。違いは、ドット演算子によって与えられます。

6

vector<int>(v1);は、vector<int> v1;と同じです。すなわち可変的な再定義。

+1

そして、これらの愚かなかっこの理由は、 'std :: vector (* pFunc)(std :: list )'のようなもっと複雑なケースでは、 。 '*'は 'std :: vector 'ではなく、 'pFunc'と一緒に使用されます。 – MSalters

4

vector<int>(v1)式は平野文がある

...一時的なオブジェクトを生成し、operator=の右側に置くことができますが、我々は文としてvector<int>(v1)表現を使用している場合、私たちは失敗しますコンパイラによって異なって扱わ:

vector<int>(v1); //error C2086: “std::vector<_Ty> v1”: redefinition 

は、WRIの代替方法ですティン

vector<int> v1; 

だからv1を再定義しているとコンパイラが文句を言います。


void foo(const std::vector<int>& v) 
{ 
} 

インスタンスの一時的な初期化作業の使用を参照してくださいと

foo(vector<int>(v1)); 

または単に

(std::vector<int>)(v1); // this creates a temporary which is immediately disposed 

を呼び出すために@Sergey AさんanswerからSee live demo for the latter


1)盗まれたが、彼はそれを