是否可以将值分配给移出位置?
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
:
除非另有指定,否则所有已从中移动的标准库对象都将处于有效但未指定的状态。也就是说,只有没有前置条件的函数(如赋值运算符(才能在对象移动后安全地在对象上使用。
(强调我的(。
这意味着您的buffer
在被移出后处于正确但未指定的状态 - 能够分配给其他东西。在这种情况下,这种操作被认为是安全的。不安全的是,通过operator []
等方式访问它。
可以对移出对象执行的操作完全是用户定义的(假设从核心语言的角度来看C++标准库类也是"用户定义的"(。因此,在一般情况下,您需要查阅特定类(或库(的文档,以确定可以使用某些特定类型的移出对象执行哪些操作。
当涉及到标准库中C++类时,答案是"是":您可以在从中移动后分配给这些类的对象。C++标准库的规范明确允许这样做。
不同的库可能会决定遵循不同的约定,尽管我会说禁止这种分配不会成为好的设计。
相关文章:
- 将字符移出范围的危险
- 将移出参数的最佳做法
- 是否可以将值分配给移出位置?
- 将键移出 std::map<> &&
- 移出某些元素后无法从矢量中删除
- 当鼠标移出窗口时,SFML 窗口会自行关闭
- 虚拟析构函数将对象移出 rodata 部分
- 将代码移出类定义时未扩展参数包
- 如何将变量从 for 循环中移出?
- 在移出向量上调用 size() 方法是否安全?
- 从移出对象移动
- 在 2D 阵列板中移动并防止玩家移出板
- 可以将std::getline()与从std::string中移出的字符串一起使用吗
- 是否可以将 std::move 对象移出函数?(C++11).
- 是否应将移出对象保留为"safe"状态?
- 如何将unique_ptr移出矢量<Foo><unique_ptr>?
- 如何使用默认移动构造函数将数据移出范围
- 移出 C++11 中 std priority_queue 元素
- 头文件中定义的多个结构 - 我是否应该将它们移出单独的 h 和 cpp 文件中
- 将资源移出泛型类