Я просматриваю код Microsoft и заметил следующее:
В функцию передается необязательный параметр std::vector<T>* vOut
.
Сама функция использует отдельный локальный std::vector<T> result
для необязательного результата.
В конце функции они делают следующее, чтобы передать результат вызывающей стороне:
if (vOut) {
std::swap(*vOut,result);
}
зачем кому-то использовать здесь std::swap
вместо назначения перемещения, например
*vOut = std::move(result)
?
Похоже, шесть штук одного против полдюжины другого. Есть ли преимущество у любого из них? Мне не кажется. Любой из них должен быть так же хорош, как и другой. Если только вы не описали два способа реализации и не обнаружили, что один из них превосходит другой.
@Элджей, никто здесь ничего не говорил о производительности. однако std::move
на самом деле будет сигнализировать о передаче права собственности, не так ли?
@Raildex, этот коммит был сделан 10 лет назад, и есть большая вероятность, что код еще старше. Так что вполне возможно, что std::move
тогда не был доступен/поддерживался.
std::swap
сигнализирует об обмене правами собственности и не имеет потенциальной проблемы использования после перемещения, которая есть std::move
. (Это не значит, что использование после перемещения является проблемой в этом случае. И производительность в этом случае не является проблемой.)
@CoryKramer, тебе не следует. См. Сменный
Ну, всегда есть вероятность, что что-то было сделано до C++11, поэтому ходы могли быть недоступны.
Однако я могу иногда использовать swap
, когда хочу, чтобы другой объект находился в «более определенном» состоянии — то есть переместил данные, но при этом имел бы чистый объект, а не просто тот, который просто безопасно использовать.
И, наконец, что не менее важно, кто-то может не задумываться о каждой мельчайшей детали — не каждая часть производственного кода рассматривается как хрестоматийный пример, и std::move
против std::swap
во многих случаях является в лучшем случае микрооптимизацией (этот шаг может даже быть реализован поверх участника swap
), так что об этом особо беспокоиться не стоит.
Даже если код не был написан до C++11, многие программисты в этом случае привыкли использовать std::swap
, и, поскольку это не имеет значения, они, вероятно, не станут менять свой код. привычки.
@JamesKanze да, это то, что я пытался охватить третьим вариантом :-)
В качестве гниды я бы вместо этого использовал обмен участниками
vOut->swap(result)