find_if()在const函数中返回意外的迭代器类型

时间:2014-11-20 00:56:42

标签: c++ stl iterator type-conversion const

以下是一些使用g ++ 4.8产生以下错误的代码的简化版本:

x.cpp: In member function ‘void Container::find() const’:
x.cpp:11:71: error: 
conversion from ‘__gnu_cxx::__normal_iterator<const Element*, std::vector<Element> >’ to non-scalar type ‘std::vector<Element>::iterator {aka __gnu_cxx::__normal_iterator<Element*, std::vector<Element> >}’ requested vector<Element>::iterator it = find_if(v.begin(), v.end(), f);

以下是代码:

#include <algorithm>
#include <vector>
using namespace std;

struct Element{};
struct Functor{ bool operator()(const Element & ){return false;}; };
struct Container{
   vector<Element> v;
   void find() const {
      Functor f;
      vector<Element>::iterator it = find_if(v.begin(), v.end(), f);
   }
};
int main() { return 0; }

删除find()函数上的const限定符后,错误消失。 错误的原因是什么?鼓励参考标准。 已删除谓词等的逻辑以关注感兴趣的问题。 clang 3.4产生类似的结果。

1 个答案:

答案 0 :(得分:2)

由于v const Container::findconst} v.begin()v.end()find_if的类型,因此vector<Element>::const_iterator返回类型{{1}},为{{1}}。