EDIT:このスレッドで説明した3つの形態の
、不要なコピーを回避する一つの@ max66によって提案された形態です。次のコードは、その出力は、アクションでこれらの3つの形式が捉え
#include <iostream>
#include <map>
using namespace std;
struct FooStruct
{
FooStruct()
{
cout << "FooStruct Default Constructor" << endl;
}
FooStruct(const FooStruct& other)
{
this->a = other.a;
this->b = other.b;
cout << "FooStruct Copy Constructor" << endl;
}
FooStruct(int a, int b)
{
this->a = a;
this->b = b;
cout << "FooStruct Parametrized Constructor" << endl;
}
int a;
int b;
};
出力:
foo.emplace<int, FooStruct>(0, {1, 2})
FooStruct Parametrized Constructor
FooStruct Copy Constructor
fooMap.emplace(make_pair<int, FooStruct>(1, { 2, 3 }))
FooStruct Parametrized Constructor
FooStruct Copy Constructor
FooStruct Copy Constructor
fooMap.emplace(std::piecewise_construct, std::forward_as_tuple(2), std::forward_as_tuple(2, 4))
FooStruct Parametrized Constructor
============
ORIGINAL(WRONG)
私は少し怠惰で、質問を投稿する前に深く掘り下げようとはしませんでした。私は今これらの3つのフォーム(@ max66のコメントから3番目のフォームが来ている)が、FooStruct
という一時的なコピーの作成を避けるという点で同等であることを確認しました。
#include <iostream>
#include <map>
using namespace std;
struct FooStruct
{
FooStruct() { cout << "FooStruct Default Constructor" << endl; }
FooStruct(int a, int b) { this->a = a; this->b = b; cout << "FooStruct Parametrized Constructor" << endl; }
int a;
int b;
};
int main()
{
map<int, FooStruct> fooMap;
fooMap.emplace<int, FooStruct>(0, {1, 2});
fooMap.emplace(make_pair<int, FooStruct>(1, { 2, 3 }));
fooMap.emplace(std::piecewise_construct, std::forward_as_tuple(2), std::forward_as_tuple(2, 4));
return 0;
}
(ビジュアルC++ 2015で構築された)上記のコードは次のような出力生成:
FooStruct Parametrized Constructor
FooStruct Parametrized Constructor
FooStruct Parametrized Constructor
PSを:私は上記の出力の各行は
上記単一据え付けるコールに対応していることを確認しました
違いは、 'make_pair'は' pair'の移動コンストラクタのセマンティクスを使いますが、他の方法ではテンプレートのコンストラクタを呼び出すことができます。 – Swift
'fooMap.emplace(std :: piecewise_construct、std :: forward_as_tuple(0)、std :: forward_as_tuple(1、2));'はどうでしょうか? – max66
@ max66:あなたのフォームは上記の2つより優れていると言っていますか?もしそうなら、なぜそれが事実であるか説明してもらえますか? – DigitalEye