在移出向量上调用 size() 方法是否安全?



Standard 指定 STL 容器在开始移动后(在本例中我们讨论的是启用移动构造/分配的std::move)处于有效但未指定的状态

我相信这意味着我们只能应用不需要先决条件的操作。我记得这里有人在Stackoverflow上声称这是真的,经过一番检查后我同意了。不幸的是,我不记得我检查过哪些来源。此外,我无法在标准中找到相关信息。

[container.requirements.general/4]62([tab:container.req])可以看出a.size()没有前提条件。这是否意味着此代码是安全的?

#include <iostream>
#include <vector>
int main() {
std::vector<int> v1 = {1, 2, 3};
std::vector<int> v2 = std::move(v1);
std::cout << v1.size(); // displaying size of the moved-from vector
}

未指定此代码将打印什么,但它安全吗?意思是,我们这里有未定义的行为吗?

编辑:我不相信这个问题会太宽泛,如果我问其他容器。答案在所有其他STL 容器(包括std::string)中是否一致?

由于缺乏前提条件,这里没有未定义的行为。该标准保证移出的容器将保持有效但未指定的状态。有效状态意味着可以调用任何没有前提条件的内容,但结果将是不可预测的。

所以是的,这不是 UB,但绝对没用,是个坏主意。

最新更新