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