にstd::initializer_list
は参照型(右辺値と左辺値の両方)を含めることができますか?または、ポインタまたは参照ラッパー(などstd::ref
)を使用する必要がありますか?
編集:
おそらく、より明確にする必要があります:
::std::vector<std::function<void()> >
ラムダオブジェクトを転送したいメンバー変数、があります。これは通常、で実行さemplace_back
れますが、コンストラクターの初期化リストで実行したかったのです。悲しいかな、私が読んだように、これは転送を不可能にするでしょう。
に
std::initializer_list
は参照型(右辺値と左辺値の両方)を含めることができますか?
std::initializer_list<T>
その要素への参照を保持していません。値をオブジェクトとして保持することにより、コピーセマンティクスを使用しconst
ます。
18.9
イニシャライザリスト[support.initlist]
タイプのオブジェクトは、タイプのオブジェクトの
initializer_list<E>
配列へのアクセスを提供しますconst E
。
initializer_list
iternallyポインタはイテレータのために使用されているので参照のは、コンパイルエラーが発生します。
#include <initializer_list>
int main()
{
int x;
std::initializer_list<int&> l = {x};
// In instantiation of 'class std::initializer_list<int&>':
// error: forming pointer to reference type 'int&'
// typedef const _E* iterator;
}
またinitializer_list
、const
オブジェクトはから移動できないため、移動セマンティクスもサポートしていません。std::reference_wrapper<T>
参照セマンティクスを維持したい場合は、オブジェクトをに保持することが最も実行可能なソリューションです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加