これら質問ここ の回答に基づいて、c ++ 14の_std::make_unique
_を使用するよりも使用する方が確かに好ましいことを私は知っていますemplace_back(new X)
直接。
とは言うものの、
_my_vector.Push_back(std::make_unique<Foo>("constructor", "args"));
_
または
_my_vector.emplace_back(std::make_unique<Foo>("constructor", "args"));
_
つまり、_Push_back
_から構築された_emplace_back
_を追加するときに、_std::unique_ptr
_または_std::make_unique
_を使用する必要がありますか?
====編集====
なぜ? c:<-(小さな笑顔)
新しいオブジェクトの構築に関する限り、違いはありません。すでにunique_ptr<Foo>
prvalue(make_unique
の呼び出しの結果)があるため、Push_back
とemplace_back
の両方が要素を構築するときにunique_ptr
移動コンストラクターを呼び出しますvector
に追加されます。
ユースケースに挿入後に新しく構築された要素へのアクセスが含まれる場合、emplace_back
は要素への参照を返すため、C++ 17以降より便利です。だから代わりに
my_vector.Push_back(std::make_unique<Foo>("constructor", "args"));
my_vector.back().do_stuff();
あなたは書ける
my_vector.emplace_back(std::make_unique<Foo>("constructor", "args")).do_stuff();
明らかに
template<class T, class A, class...Args>
void Push_unique( std::vector<std::unique_ptr<T>,A>& v, Args&&...args ) {
v.Push_back( std::make_unique<T>(std::forward<Args>(args)...) );
}
最良のオプションです:
Push_unique(my_vector,"constructor", "args");
悲しいことに、これは接頭辞表記です:(演算子、コンテナ、引数...)対中置(コンテナ演算子引数...)。
拡張メソッド または 名前付き演算子 のように、中置にする方法があれば。
それはかっこいいから。