《C++ Primer》Section 9.2, Table 9.4, 有一项关于
seq.assign(b, c)
说
迭代器 b 和 e 不能引用 seq.
中的元素
但是,当我尝试使用
seq.begin()
和seq.end()
分配回seq
时,没问题。所以我对这个项目感到困惑,或者我误解了它。
以下代码运行成功并输出
2 3 4
.
#include<iostream>
#include<vector>
int main(){
std::vector<int> b{1, 2, 3, 4};
b.assign(b.begin() + 1, b.end());
std::cout << b[0] << ' ' << b[1] << ' ' << b[2];
return 0;
}
我知道
assign()
会使左侧容器中的迭代器失效,但是实现中发生了什么?破坏发生在任务之前还是之后?
查看您的代码并阅读 https://en.cppreference.com/w/cpp/container/vector/assign,很明显您正在导致 undefined behavior。这意味着任何事情都可能发生——它可能正常工作,它可能崩溃,或者它可能输出不正确的数据,或者更糟的事情。并不是说运行同一个程序两次甚至会产生相同的未定义行为结果。
所以,是的,就正确的代码而言,展示一个可以正常工作的玩具示例毫无价值,而且您的代码存在错误。
当函数输入的前提条件像这里一样清楚地说明时,你一定不能偏离,否则你会得到不可靠的从而破坏行为。