Re[10]: про перемещение вопрос
От: Erop Россия  
Дата: 03.06.19 12:25
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Т.е. я ожидаю, что следующие постусловие метода set_foos(std::vector<Foo>&&) будет соблюдатся:

BFE>
BFE>assert(0 == foos.capacity());
BFE>


Почему? Разве есть такие гарантии?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[11]: про перемещение вопрос
От: B0FEE664  
Дата: 03.06.19 13:17
Оценка:
Здравствуйте, Erop, Вы писали:

E>Почему?

Такое поведение мне кажется естественным.
Если я вижу, например, код: MyStr("5") + MyStr("6"), то результатом я ожидаю MyStr("56"), а не MyStr("11").
Так же и тут: зачем перемещённому объекту память?

E>Разве есть такие гарантии?

Нет.
И каждый день — без права на ошибку...
Re[12]: про перемещение вопрос
От: Erop Россия  
Дата: 03.06.19 13:34
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Так же и тут: зачем перемещённому объекту память?

Ну, например, что бы не иметь выделенное "пустое" состояние...

Я согласен с тезисом, что принципу наименьшего удивление в случае обсуждаемого метода будет соответствовать поведение максимально похожее на поведение присваивания...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: про перемещение вопрос
От: watchmaker  
Дата: 03.06.19 13:39
Оценка: +1
Здравствуйте, B0FEE664, Вы писали:

BFE>Такое поведение мне кажется естественным.

BFE>Так же и тут: зачем перемещённому объекту память?
Незачем. Но дело ведь не в этом, а в том, что и причин для её отсутствия нет.

Вдруг там метод внутри устроен, например, так:
void set_foos(std::vector<Foo>&& foos) {
  if (needs_foos()) {
    this->foos = std::move(foos);
  } else {
    // no-op optimization
  }
}

Вполне валидная и достаточно часто встречающаяся реализация, которая может оставить foos непустым.

Или вдруг там внутри написано просто:
void set_foos(std::vector<Foo>&& foos) {
  this->foos.swap(foos);
}

Тоже вполне допустимый код.

Плюс есть ещё такие сценарии, когда объект и рад бы забрать память, но не может сделать из-за того, что у вектора другой аллокатор: https://stackoverflow.com/questions/17730689/is-a-moved-from-vector-always-empty/17735913#17735913
Re: про перемещение вопрос
От: snoman Россия  
Дата: 04.06.19 08:40
Оценка:
Здравствуйте, borya_ilin, Вы писали:

_>Господа, если не сложно, напомните мне пожалуйста, как мы поступаем в такой ситуации в этом нашем новом c++?


_>
_>struct Bar {
_>  void set_foos(const std::vector<Foo> &foos) {} // 1)
_>};


Передавать foos по значению. А в set_foos перемещать вектор куда там требуется
void set_foos(std::vector<Foo> foos) {
    _foos = std::move (foos);
}


Смысл в следующем: только вызывающая сторона знает нужен ли ей вектор foos после вызова cur_bar.set_foos или нет.
И тогда два варианта использования:

    cur_bar.set_foos(foos);             // Вариант 1. Данные foos еще понадобятся.  Копирование в аргумент, перемещение внутри функции.
    cur_bar.set_foos(std::move(foos));  // Вариант 2. Данные foos больше не нужны . Перемещение в аргумент, перемещение внутри функции.


Еще бонус в том, что не нужно удваивать интерфейс struct Bar, чтобы поддерживать и копирование и перемещение.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.