【发布时间】:2015-07-23 00:24:27
【问题描述】:
有人可以向我解释一下 C++ 中 const iterator 引用和 non-const iterator 引用之间的区别吗?
为什么我不能在print 函数中使用non-const iterator 引用?
以下代码无法编译。
#include <deque>
#include <iostream>
using namespace std;
template<typename T> ostream & print(T & start, T & end) {
for (; start != end; ++start) {
cout << *start << " ";
}
return cout;
}
int main() {
int tab[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
deque<int> d1(tab, tab + 10);
deque<int> d2;
deque<int>::iterator it;
for (it = d1.begin(); it != d1.end(); ++it) {
d2.push_back(d1[d1.end() - it - 1]); //LINE I
}
print(d2.rbegin(), d2.rend()) << endl; //LINE II
return 0;
}
错误信息对我来说有点神秘。
hello.cpp:21:33: error: invalid initialization of non-const reference of type ‘std::reverse_iterator<std::_Deque_iterator<int, int&, int*> >&’ from an rvalue of type ‘std::deque<int>::reverse_iterator {aka std::reverse_iterator<std::_Deque_iterator<int, int&, int*> >}’
print(d2.rbegin(), d2.rend()) << endl; //LINE II
^
hello.cpp:6:32: error: in passing argument 1 of ‘std::ostream& print(T&, T&) [with T = std::reverse_iterator<std::_Deque_iterator<int, int&, int*> >; std::ostream = std::basic_ostream<char>]’
template<typename T> ostream & print(T & start, T & end) {
我设法更改了代码(基于另一个代码示例)以使其正常工作。
#include <deque>
#include <iostream>
using namespace std;
template<typename T> ostream & print(const T & start, const T & end) {
T tmp = start;
for (; tmp != end; ++tmp) {
cout << *tmp << " ";
}
return cout;
}
int main() {
int tab[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
deque<int> d1(tab, tab + 10);
deque<int> d2;
deque<int>::iterator it;
for (it = d1.begin(); it != d1.end(); ++it) {
d2.push_back(d1[d1.end() - it - 1]); //LINE I
}
print(d2.rbegin(), d2.rend()) << endl; //LINE II
return 0;
}
我得到了一个结果。
1 2 3 4 5 6 7 8 9 10
我认为区别在于const iterator 引用和non-const iterator 引用的声明。但我不明白为什么。我查看了C++ Reference 并尝试复习我的课程,但未能成功获得理解。
【问题讨论】: