为什么我不能将迭代器应用于接受 const_iterator 引用的函数?
Why can't I apply an iterator to a function which accepts a reference of const_iterator?
这是代码。
#include <vector>
void moveIterator(std::vector<char>::const_iterator& v) {
v++;
}
int main() {
std::vector<char> v;
std::vector<char>::iterator iter = v.begin();
moveIterator(iter);
}
编译失败。这是错误。
candidate function not viable: no known conversion from 'std::vector<char>::iterator' (aka '__normal_iterator<char *, std::vector<char, std::allocator<char> > >') to 'std::vector<char>::const_iterator &' (aka '__normal_iterator<const char *, std::vector<char, std::allocator<char> > > &') for 1st argument
但是如果我删除参数中的&
,它可以工作,如下所示:
void moveIterator(std::vector<char>::const_iterator v) { // no &
v++;
}
似乎我无法将iterator
应用于接受const_iterator
引用的函数,为什么?
> 出于同样的原因,您不能用std::vector<char>
调用f(std::string&)
。
在大多数实现中,
-
std::vector<char>::const_iterator
, - 和
std::vector<char>::iterator
是两个不同的类,并且不可能从一个类转换为另一个类(非常量(引用。
您可以做的是将moveIterator
定义为模板:
template<class InputIt>
void moveIterator(InputIt& it) {
++it;
}
std::vector<int> v;
auto it = v.begin();
auto cit = v.cbegin();
moveIterator(it); // iterator
moveIterator(cit); // const_iterator
虽然有从iterator
到const_iterator
的转换,这将需要一个临时的引用来绑定,因为参数本身不是const_iterator
的。因此,非常量左值引用是非起始引用。
iterator
和const_iterator
甚至不需要是类类型。指针也是迭代器(实际上是优化构建中向量的迭代器类型(。考虑:
void foo(int const*& p) { }
void bar() {
int i = 0;
foo(&i);
}
这会产生完全相同的错误。
你不能
这样做,因为它会让所有的地狱都松动。
请考虑以下代码:
#include <vector>
const std::vector<char> doNotChangeMe; // in ROM
void breakMe(std::vector<char>::const_iterator& v) {
v = doNotChangeMe.cbegin();
}
int main() {
std::vector<char> v;
std::vector<char>::iterator iter = v.begin();
breakMe(iter); // imagine this is allowed
*iter=42; // what happens here?
}
这基本上与T **
不可转换为const T **
的原因相同。
const_iterator
不是const iterator
它们是不同的类型。
const std::vector::iterator != std::vector::const_iterator
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- std::iterator::reference 必须是引用吗?
- c++ std::map::iterator一无所获,但下标操作符返回对映射值的引用