我不确定标准对此情况有何规定。我知道移出的位置应该可以破坏,但是我不知道是否允许在其中添加新值。
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)));
,程序会不正确吗?
答案 0 :(得分:3)
否,程序不会不正确。由于std::move
,它会安全正确地运行:
除非另有说明,否则已将从中移出的所有标准库对象置于有效但未指定的状态。也就是说,对象移出后,只有没有先决条件的功能(例如赋值运算符)才能安全地用于该对象。
(重点是我的)。
这意味着您的buffer
在移出后处于正确但未指定的状态-可以分配给其他对象。在这种情况下,这种操作被认为是安全的。 是不安全的,是通过operator []
等访问它。
答案 1 :(得分:0)
对移出对象的处理完全是用户定义的(假设从核心语言的角度来看,C ++标准库类也是“用户定义的”)。因此,通常情况下,您需要查阅特定类(或库)的文档,以确定可以使用某些特定类型的移出对象来完成的事情。
对于C ++标准库中的类,答案是“是”:从中移出后,您可以将其分配给这些类的对象。 C ++标准库的规范明确允许。
不同的库可能会决定遵循不同的约定,尽管我想说禁止这种分配不会带来好的设计。