以下是一些使用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产生类似的结果。
答案 0 :(得分:2)
由于v
const
Container::find
(const
} v.begin()
,v.end()
和find_if
的类型,因此vector<Element>::const_iterator
返回类型{{1}},为{{1}}。