C ++ 11 вводит семантику, чтобы избежать ненужного копирования объектов, и std::move
, чтобы применять эту семантику, когда в противном случае произойдет копирование.Однако теперь есть также некоторые случаи, когда требуется копия, но не по умолчанию.
Рассмотрим, например, эту наивную реализацию reverse
.Поскольку основанный на диапазоне for
использует идеальную пересылку, изменение контейнера внутри цикла приводит к повреждению.
auto out_iter = container.rbegin();
for ( auto value : container ) {
* out_iter ++ = value;
}
Цель состоит в том, чтобы исправить это с помощью
for ( auto value : copy( container ) ) {
Это кажется простымдостаточно ... принять любой аргумент, получить базовый тип и вернуть временную копию.