Здравствуйте, rg45, Вы писали:
BFE>>1. Такое поведение неожиданно.
R>Какое "такое"?
вызов выглядит так:
bar.set_foos(std::move(foos));
Я ожидаю, что после этого foos не владеет никакой динамической памятью. Впрочем, быть может, это мои проблемы.
BFE>>2. Зачем тут &&? Достаточно простой ссылки.
R>А вот это как раз будет неожиданно, когда foos вдруг лишится своих элементов в таком сценарии:
R>R>Bar bar;
R>std::vector<Foo> foos {/*. . . */};
R>bar.set_foos(foos);
R>
Тут я согласен, так делать не следует.
Меня смущает другое: семантика перемещения используется не понятно зачем. Какое же это перемещение?
Ещё меня смущает то, что объект используется после того, как его переместили, но это мелочи.
R>Ты не замечаешь, что мы с тобой говорим про две разные функции? Я говорю про исходную set_foos, а ты ее уже мыслено зарефакторил, наделил ее другой семантикой и смотришь на нее как на swap_foos.
Ну это ещё как посмотреть... По мне это у вас поменялась семантика set_foos без изменения имени функции.
Я не против добавления функции
set_foos(std::vector<Foo> &&foos) (или, быть может,
set_foos(auto&& foos)), но только с ожидаемым поведением.
R>Давай я еще раз сформулирую свою позицию: для того, чтобы достичь оптимизации по скорости, о которой ты говоришь здесьАвтор: B0FEE664
Дата: 17.05.19
, не обязательно переделывать set_foos на swap_foos.
Я бы не стал переделывать, я бы просто добавил бы функцию swap_foos.