2011-08-13 17 views
9

私は私が間違ってemplace_backを理解している場合このように、私は本当に疑問に思って正しくC++ 0xのemplace_back

#include <vector> 
using namespace std; 

struct Hero { 
    Hero(const string&) {} 
    Hero(const char*) {} 
    Hero(int) {} 
    // forbid a clone: 
    Hero(const Hero&) = delete; 
    Hero& operator=(const Hero&) = delete; 
}; 

int main() { 
    vector<Hero> heros1 = { "Bond", "Hulk", "Tarzan" }; // ERR: copies? 

    vector<Hero> heros; 
    heros.emplace_back(5);    // ERR: copies 
    heros.emplace_back(string("Bond")); // ERR: copies 
    heros.emplace_back("Hulk");   // ERR: copies 
} 

emplace_backを理解している場合、私は疑問に思う:私それはコピーを作成するを防止するであろうけれどもHeroの場合はにという項目が作成されているためです。

私のg ++​​ - 4.7.0で実装エラーですか?

+2

これはもはやC++ 0xです。今はちょうどC++です! ':)' –

答えて

6

あなたはこのように、移動のコンストラクタを定義し、オペレータ割り当てを移動する必要があります。型ヒーローの値が関数に移動する

struct Hero { 
    Hero(const string&) {} 
    Hero(const char*) {} 
    Hero(int) {} 

    Hero(Hero&&) {} 
    Hero& operator=(Hero&&) { return *this; } 

    // forbid a clone: 
    Hero(const Hero&) = delete; 
    Hero& operator=(const Hero&) = delete; 
}; 

これができます。通常、移動はコピーよりも高速です。タイプがコピー可能でも可動でもない場合は、std::vectorで使用することはできません。

+1

これはあなたのために生成されることに注意する必要があります、それはコードがコンパイルされ、実行した理由は –

+0

これは不幸です。移動コンストラクタが必要な場合、emplaceは実際に** inplace **コンストラクタに任意の可変引数を転送していないので、移動したコピーを作成しています。そうすれば、emplace_backはまったく役に立たなくなるでしょう。 – lurscher

+2

@lurscher 'std :: vector'で使用するには、オブジェクトをコピー可能または移動可能にする必要があります。 –

3

ええと...私はそれを得ました。

私はコピーHero秒にforbit場合、私はコンテナに入れたい場合は、私は、移動にそれらを許可する必要があります。私の愚かなこと。

struct Hero { 
    Hero(const string&) {} 
    Hero(const char*) {} 
    Hero(int) {} 
    // no clone: 
    Hero(const Hero&) = delete; 
    Hero& operator=(const Hero&) = delete; 
    // move only: 
    Hero(Hero&&) {} 
    Hero& operator=(Hero&&) {} 
}; 

そして、初期化子リスト作業を除くすべての例

+7

'emplace_back'自体は、タイプを移動可能にする必要はありません。あなたが思ったようにインプレースを構築します。しかし、 'std :: vector' *は一般的に、その要素の型が移動可能であるかコピー可能である必要があります。そうでなければ、必要に応じて拡張できません。 – JohannesD

4

これは実装エラーではありません。移動コンストラクタを指定していません。

+0

あなたは早かった!私はちょうど私自身の答えを入力していた;-) – towi

関連する問題