Стандартные контейнеры "map" в С++ позволяют вставлять rvalue:
T x;
std::map<int, T> m;
// m[1]; // populate "1"
auto it = m.insert(std::make_pair(1, std::move(x)));
Вопрос заключается в том, что происходит, когда элемент уже существует, т.е. it->second == false
. Был ли элемент x
уже "перемещен-из"? Например, если это уникальный указатель, x
был reset равным null?
Патентованный ответ в приведенном выше случае - "да", потому что перемещение происходит уже в точке создания пары. Но предположим, теперь я хочу обновить существующее значение, но все равно сохраняю информацию о том, существовало ли значение или нет (поэтому я не могу просто сказать m[1] = std::move(x);
). Возможно ли "не перейти от" объекта в этом случае?
В GCC я обнаружил, что следующие работы [Обновление: работает в GCC 4.6, не работает в GCC 4.8]:
auto it = m.insert(std::pair<const int, T &&>(1, std::move(x)));
Но гарантируется ли это, что он не движется?