2017-09-06 10 views
2

我々は次のようにシンプルなダミーのクラスを作成する場合:なぜイニシャライザリストは、1つのコピーだけでなく、2つのデータのコピーをファンクションに渡すのですか?

struct example { 
    example() { std::cout << "Create" << std::endl; } 
    example(const exam&) { std::cout << "Copy" << std::endl; } 
    example(example &&) noexcept { std::cout << "Move" << std::endl; } 
} 

を、初期化リスト(std::initializer_list<example>)でそれを渡します

some_function({example()}); 

出力(GCC/C++ 11から)されます:

Create 
Copy 
Copy 

あなたはその後、たとえばオブジェクト自体を作成initializer_listを通してそれを渡すように、これは私には意味がありません。つまり、元のオブジェクトを持ち、リストにオブジェクトのコピーがあり、関数にリスト(例のオブジェクトではありません)のコピーがあり、オブジェクトの単一の作成でなければならないことを暗示します。初期化子リスト

(余分なコピーなし)

期待出力:

Create (from example()) 
Copy (into initializer_list) 

TL; DR:オブジェクトが初期化に渡さなった場合に2つのオブジェクトのコピーの代わりの1をインスタンス初期化子リストを通じて自分のオブジェクトを渡すのはなぜリスト自体は?

#include <iostream> 
#include <initializer_list> 

struct example { 
    example() { std::cout << "Create" << std::endl; } 
    example(const example &) { std::cout << "Copy" << std::endl; } 
    example(example &&) noexcept { std::cout << "Move" << std::endl; } 
}; 

void some_function(std::initializer_list<example> input) { 
    for (example exam : input) { 
     std::cout << &exam << std::endl; 
    } 
} 

int main() 
{ 
    example exam; 
    some_function({exam}); 
} 
+3

質問している内容の完全でコンパイル可能な例を投稿してください。 –

+0

2番目のコピーが 'initializer_list'自体から来ていることをどのように知っていますか?リストで実際にやっている 'some_function()'とは何ですか? 'some_function()'はどのように宣言されていますか? –

+0

@NeilButterworthの例を編集して追加します。 –

答えて

4

第2のコピーはイニシャライザリスト自体とは関係ありません。あなたがあなたのリストを反復処理するときに、第2のコピーは、あなたが「const参照によって」それを繰り返す場合は、代わりsecondyコピーが消えます

for (example exam : input) { 
    std::cout << &exam << std::endl; 
} 

「の値によって」あなたのsome_function内に作成されます。

+0

Bam。愚かな間違い。ありがとうございました! –

+0

私は再現できませんでした - 私は全くコピーを持っていません - 作成のみ –

関連する問題