編集:始める前に、この質問は;の適切な使用法に関するものではありません。std::initializer_list
便利な構文が必要な場合に何を渡す必要があるかについてです。話題にとどめていただきありがとうございます。
C++11 ではstd::initializer_list
、波括弧初期化リスト引数を受け入れる関数を定義することが導入されています。
struct bar {
bar( char const * );
bar( int );
} dog( 42 );
fn foo( std::initializer_list< bar > args );
foo( { "blah", 3, dog } );
構文は素晴らしいですが、内部ではさまざまな問題のために不快です。
意味のある移動はできません。上記の関数
dog
はリストからコピーする必要があります。これは、移動構築または省略に変換できません。移動専用タイプは一切使用できません。(まあ、const_cast
実際には有効な回避策です。そうすることに関する記事があれば、それを見てみたいです。)constexpr
セマンティクスもありません。(これは C++1y で間もなくリリースされます。ただし、これは小さな問題です。)const
他の場所のように伝播しません。はinitializer_list
決してありませんconst
が、その内容は常にあります。(コンテンツを所有していないため、コピーに書き込みアクセスを与えることはできませんが、どこにでもコピーすることはほとんど安全ではありません。)オブジェクトはその
initializer_list
ストレージを所有していません (yikes)。ストレージを提供する完全に分離された裸の配列 (yikes) との関係は、バインドされた一時的な参照の関係 (4 倍の yikes) としてあいまいに定義されます (yikes)。
これらの問題はやがて修正されると信じていますが、今のところ、ハードコーディングせずに利点を得るためのベストプラクティスはありinitializer_list
ますか? それに直接依存することを回避するための文献や分析はありますか?
明らかな解決策は、 などの標準コンテナを値渡しすることですstd::vector
。オブジェクトが からコピーされると、initializer_list
値によって渡されるようにムーブ構築され、コンテンツを移動できます。改善は、スタック上にストレージを提供することです。initializer_list
優れたライブラリは、 、array
、およびのほとんどの利点をvector
、前者を使用しなくても提供できる場合があります。
リソースはありますか?