我可以将值分配到移出的位置吗?

时间:2018-08-28 23:40:20

标签: c++ move-semantics

我不确定标准对此情况有何规定。我知道移出的位置应该可以破坏,但是我不知道是否允许在其中添加新值。

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 :(得分:3)

否,程序不会不正确。由于std::move,它会安全正确地运行:

  

除非另有说明,否则已将从中移出的所有标准库对象置于有效但未指定的状态。也就是说,对象移出后,只有没有先决条件的功能(例如赋值运算符)才能安全地用于该对象。

(重点是我的)

这意味着您的buffer在移出后处于正确但未指定的状态-可以分配给其他对象。在这种情况下,这种操作被认为是安全的。 是不安全的,是通过operator []等访问它。

答案 1 :(得分:0)

对移出对象的处理完全是用户定义的(假设从核心语言的角度来看,C ++标准库类也是“用户定义的”)。因此,通常情况下,您需要查阅特定类(或库)的文档,以确定可以使用某些特定类型的移出对象来完成的事情。

对于C ++标准库中的类,答案是“是”:从中移出后,您可以将其分配给这些类的对象。 C ++标准库的规范明确允许。

不同的库可能会决定遵循不同的约定,尽管我想说禁止这种分配不会带来好的设计。