Могу ли я присвоить значение перемещенному месту? - PullRequest
0 голосов
/ 29 августа 2018

Я не уверен, что стандарт говорит об этой ситуации. Я знаю, что удаленное местоположение должно быть в состоянии уничтожить, но я не знаю, разрешено ли мне добавлять в него новое значение.

std::vector<int> get_user_input(const std::string& prompt) {
  std::vector<int> numbers;
  std::string buffer;

  do {
    std::cout << prompt;
    std::getline(std::cin, buffer);
  } while (buffer == "");

  std::stringstream stream (buffer);

  while (std::getline(stream, buffer, ' ')) {
    numbers.push_back(std::atoi(buffer.c_str()));
  }

  return numbers;
}

Будет ли программа некорректной, если вместо нее будет использоваться std::stringstream stream(std::move(buffer)));?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

То, что можно сделать с перемещенным объектом, полностью определяется пользователем (при условии, что классы стандартной библиотеки C ++ также «определены пользователем» с точки зрения основного языка). Таким образом, в общем случае вам необходимо обратиться к документации для конкретного класса (или библиотеки), чтобы определить, что можно сделать с перемещенными объектами некоторых конкретных типов.

Когда речь идет о классах из стандартной библиотеки C ++, ответ «да»: вы можете назначать объекты этих классов после перемещения из. Спецификация стандартной библиотеки C ++ явно позволяет это.

Другая библиотека может принять решение следовать другому соглашению, хотя я бы сказала, что запрет такого назначения не приведет к хорошему дизайну.

0 голосов
/ 29 августа 2018

Нет, программа не будет неправильной. Он будет вести себя безопасно и правильно, так как std::move:

Если не указано иное, все объекты стандартной библиотеки, из которых были перемещены, переводятся в допустимое, но неопределенное состояние . То есть только функции без предварительных условий, , такие как оператор присваивания , могут безопасно использоваться на объекте после его перемещения из.

(выделено мое) .

Это означает, что ваш buffer после перемещения из него находится в правильном, но неопределенном состоянии - возможность быть назначенным на что-то другое. Такая операция считается безопасной в этом случае. Что бы не было бы безопасным, есть доступ к нему через operator [] и тому подобное.

...