Использование семантики перемещения с std :: pair или std :: tuple

Предположим, вы хотите воспользоваться семантикой перемещения, но один из ваших перемещаемых классов должен быть частью std :: пара . Целью может быть создание функции, которая возвращает std :: pair , которую можно рассматривать как rvalue и перенаправлять вместе с ней.

Но я не понимаю, как это можно сделать, если только не внесено внутреннее изменение в сам 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 :: пара ? Или мой компилятор просто устарел?

20
задан Deduplicator 16 November 2015 в 00:53
поделиться