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

时间:2019-07-12 13:53:52

标签: c++ c++17 stdvector move-semantics

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)中保持一致?

1 个答案:

答案 0 :(得分:7)

由于没有先决条件,因此这里没有未定义的行为。该标准保证移出的容器将处于有效但未指定的状态。有效状态意味着可以调用任何不具备先决条件的东西,但结果将是不可预测的。

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