移動セマンティクスを利用したいが、可動クラスの 1 つが の一部である必要があるとしますstd::pair
。std::pair
目的は、右辺値として扱うことができ、一緒に転送できるを返す関数を作成することです。
std::pair
しかし、移動セマンティクスを認識させるために、それ自体に内部的な変更が加えられない限り、これがどのように行われるのかわかりません。
次のコードを検討してください。
struct Foo
{
Foo() { }
Foo(Foo&& f) { }
private:
Foo(const Foo& f) { } // do not allow copying
};
int main()
{
Foo f;
std::pair<Foo, int> res = std::make_pair(f, 10); // fails due to private copy constructor
}
問題はstd::make_pair
、コンストラクタ自体と同様に、std::pair
2 つのオブジェクトを取り、それらの内部コピーを作成しようとすることです。これにより、コピー コンストラクターの呼び出しが試行されます。しかし、私の例では、新しいペアをに移動res
し、コピーが作成されないようにしたいと考えています。std::pair
内部で次のコンストラクターが定義されていない限り、これは不可能だと思います。
pair(T1&& t1, T2&& t2) : first(std::move(t1)), second(std::move(t2))
しかし、少なくとも私が使用しているコンパイラ(gcc 4.3.2)ではそうではありません。私のコンパイラが単に古くなっている可能性があり、実際には新しいバージョンにはこのムーブ対応コンストラクタがあります。しかし、現時点では移動のセマンティクスに関する私の理解はやや不安定なので、ここで何かを見落としているだけなのかどうかはわかりません。それで、実際に再実装せずに、私が達成しようとしていることは可能std::pair
ですか? または、コンパイラが古くなっていますか?