Информация об изменениях

Сообщение Re[8]: про перемещение вопрос от 17.05.2019 16:34

Изменено 17.05.2019 16:50 rg45

Re[8]: про перемещение вопрос
Здравствуйте, 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.


А я бы не стал добавлять ненужные функции.
Re[8]: про перемещение вопрос
Здравствуйте, 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.


А я бы не стал добавлять ненужные функции.