这是一些示例代码:
#include <iostream> #include <vector> template <typename T> std::vector<typename T::iterator> f(T t) { std::vector<typename T::iterator> v; for (auto i = t.begin(); i != t.end(); ++i) { v.push_back(i); } return v; } template <typename T> void print(const std::vector<T>& v) { for (auto i = v.begin(); i != v.end(); ++i) { std::cout << **i << ' '; } std::cout << std::endl; } int main() { std::vector<int> v{1,2,3}; print(f(v)); std::vector<std::vector<int>::iterator> itervec = f(v); print(itervec); }
1 2 3 163487776 2 3
问题
如果我将f(T t)改为f(T& t),则输出与预期一致.我假设因为我正在使用容器的副本,从技术上讲,我在向量上推回的迭代器与我在main中创建的向量不同.它是否正确?
我注意到的一件事是印刷品(f(v));按预期打印1 2 3但是一旦我将它分配给itervec第一个迭代器变成垃圾,这是否全部依赖于实现?