Предположим, вы хотите воспользоваться семантикой перемещения, но один из ваших подвижных классов должен быть частью 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
, берет два объекта и пытается сделать их внутренние копии.Это заставляет его пытаться вызвать конструктор копирования.Но в моем примере я хочу иметь возможность переместить новую пару в res
и убедиться, что копии не сделаны.Я думаю, что это было бы невозможно, если бы у std::pair
не было следующего внутреннего конструктора:
pair(T1&& t1, T2&& t2) : first(std::move(t1)), second(std::move(t2))
Но это не так, по крайней мере, в используемом компиляторе (gcc 4.3.2).Может случиться так, что мой компилятор просто устарел, и более новые версии на самом деле будут иметь этот конструктор, учитывающий перемещение.Но мое понимание семантики перемещения в настоящий момент несколько неубедительно, поэтому я не уверен, что просто упускаю из виду что-то здесь.Итак, возможно ли то, что я пытаюсь достичь, без реального переопределения std::pair
?Или мой компилятор просто устарел?