是否可以将值分配给移出位置?

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

本文关键字:移出 位置 分配 是否      更新时间:2023-10-16

我不确定标准对这种情况有什么看法。我知道移自位置应该能够破坏,但我不知道是否允许我在其中输入新值。

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

除非另有指定,否则所有已从中移动的标准库对象都将处于有效但未指定的状态。也就是说,只有没有前置条件的函数(如赋值运算符(才能在对象移动后安全地在对象上使用。

(强调我的(。

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

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

当涉及到标准库中C++类时,答案是"是":您可以在从中移动后分配给这些类的对象。C++标准库的规范明确允许这样做。

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