我可以为移出的位置赋值吗?

Can I assign a value into a moved-from location?

我不确定标准对这种情况是怎么说的。我知道一个移动的位置应该能够破坏,但我不知道我是否可以在其中放入一个新值。

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)));,程序会不会出错?

不,程序不会出错。它会安全且正确地运行,因为 std::move:

Unless otherwise specified, all standard library objects that have been moved from are placed in a valid but unspecified state. That is, only the functions without preconditions, such as the assignment operator, can be safely used on the object after it was moved from.

(强调我的).

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

可以对移出对象执行的操作完全由用户定义(假设从核心语言的角度来看,C++ 标准库 classes 也是 "user-defined")。因此,在一般情况下,您需要查阅特定 class(或库)的文档,以确定可以对某些特定类型的移出对象执行哪些操作。

当谈到来自 C++ 标准库的 classes 时,答案是 "yes":您可以在移动后分配给这些 classes 的对象。 C++ 标准库规范明确允许。

不同的图书馆可能会决定遵循不同的约定,尽管我会说禁止这样的分配不会带来好的设计。