Dưới đây là một số mã ví dụ:Có chuyển vùng chứa bằng trình vòng lặp không hợp lệ giá trị không?
#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);
}
On ideone đầu ra là:
1 2 3
163487776 2 3
Câu hỏi
Nếu tôi thay đổi f(T t)
-f(T& t)
đầu ra là như mong đợi. Tôi giả định bởi vì tôi đang làm việc với các bản sao của các thùng chứa, về mặt kỹ thuật các trình vòng lặp mà tôi đang đẩy trở lại trên vectơ không giống như vectơ mà tôi đã tạo ra trong chính. Điều này có đúng không? Điều tôi nhận thấy là print(f(v));
in 1 2 3
như mong đợi nhưng ngay sau khi tôi gán cho itervec
trình lặp đầu tiên trở thành rác, việc này có thực hiện tất cả phụ thuộc không?