「パーフェクトフォワーディング」の仕組みを教えてください。
ベクトルのemplace_backは、引数が可変個引数テンプレートとして実装されているため、オブジェクトをコピーしたり移動したりする必要がないことを読みました。
std::vector<T>::emplace_back(_Args&&... __args)
もっと詳しく説明していただけますか?なぜコピーも移動もしないのですか?
emplace_back
ベクトル内の正しい位置に要素を直接構築します。のように考えてください。
vector<T> v;
v.emplace_back(a,b,c);
に変換されます (idx は新しいインデックスです)
new (v.data()+idx) T(a,b,c);
(実際には、引数を転送することを含むもう少し複雑ですがstd::forward<_Args>()...
、 emplace 操作のキーを取得するのがより混乱する可能性があります)
emplace_back では、実際には 2 つのことが起こっています。