在移出向量上调用 size() 方法是否安全?
Is it safe to call size() method on moved-from vector?
标准指定STL容器,在begin moved之后(在这种情况下我们谈论std::move
启用移动构造/赋值),在有效,但 未指定 状态。
我相信这意味着我们只能应用不需要先决条件的操作。我记得这里有人在 Whosebug 上声称这是真的,经过一番检查后我同意了。不幸的是,我不记得我检查过哪些来源。此外,我没能在标准中找到相关信息。
从[container.requirements.general/4]
、table62
([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
?
这里没有未定义的行为,因为缺少pre-conditions。该标准保证 moved-from 容器将处于有效但未指定的状态。有效状态意味着可以调用任何没有先决条件的东西,但结果将不可预测。
所以是的,这不是 UB,但绝对没用而且是个坏主意。
标准指定STL容器,在begin moved之后(在这种情况下我们谈论std::move
启用移动构造/赋值),在有效,但 未指定 状态。
我相信这意味着我们只能应用不需要先决条件的操作。我记得这里有人在 Whosebug 上声称这是真的,经过一番检查后我同意了。不幸的是,我不记得我检查过哪些来源。此外,我没能在标准中找到相关信息。
从[container.requirements.general/4]
、table62
([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
?
这里没有未定义的行为,因为缺少pre-conditions。该标准保证 moved-from 容器将处于有效但未指定的状态。有效状态意味着可以调用任何没有先决条件的东西,但结果将不可预测。
所以是的,这不是 UB,但绝对没用而且是个坏主意。