6

C++0x の新しいイニシャライザ リスト機能を使用して、現在作業中の新しい API のコンパイル時に定義された項目数で std::vector を初期化したいと考えています。このようなもの:

template<int n>
std::initializer_list<std::string> duplicate(std::string s) {
  // return s duplicated n times
  return { s, s, s };
}

std::vector<std::string> v = { "foo",  duplicate<3>("bar") };

これを達成する方法はありますか?それは可能ですか?TMP と再帰を使用して重複した文字列のリストを作成し、最終的に何らかの方法で定数 (列挙型など) を介してアクセスする必要があることは承知しています。しかし、このように初期化子リストをネストすることさえできないようです。

4

1 に答える 1

8

初期化子リストを拡張するためにネストしたり、追加/連結したりすることはできません。これらは、コンパイル時のサイズの配列にアクセスするための構文糖衣にすぎません。initializer_lists をコピーしても、それらのアイテムはコピーされません。最も重要なことは、これは重複の戻り値を使用できないことを意味します! 参照された配列は、N3290 の 8.5.4p6 に従って、関数が戻るときに破棄されます。

配列の存続期間は、initializer_list オブジェクトの存続期間と同じです。

(テンポラリは return ステートメントで作成され、値によって返されます。コピー省略が発生した場合でも、コピーの他のすべてのセマンティクスは変更されません。)

たとえば、ここで作成された一時的な initializer_list と比較してください。これは ctor に渡され、オブジェクトが初期化された後に破棄されます。同じ時点で、同じ完全な式 (存在する場合) 内の他のすべての一時オブジェクトが破棄されます。

vector<string> v {"foo"};

初期化子リストを操作する代わりに、ベクトルのメソッドを使用して N 個のコピーを挿入します。

v.insert(v.end(), 3, "bar");
于 2011-04-30T09:45:47.640 に答える