std :: upper_bound返回const成员函数中的const迭代器

时间:2016-08-30 22:50:30

标签: c++ c++11 boost circular-buffer

这是一个包含某些boost::circular_buffer的{​​{1}}的类。我为迭代器创建了一个typedef到包含的struct中。

我的问题是这样的:当circular_buffer函数标记为doWork时,const的返回值与std::upper_bound类型不兼容,因为返回值有MyIterator。如果我从函数中删除boost::cb_details::const_traits关键字,我的所有编译错误都会消失。

要清楚编译错误是这样的:

const

以下是一个独立的示例:

error: conversion from ‘boost::cb_details::iterator<boost::circular_buffer<Wrapper<int>::Sample, std::allocator<Wrapper<int>::Sample> >, boost::cb_details::const_traits<std::allocator<Wrapper<int>::Sample> > >’ to non-scalar type ‘Wrapper<int>::MyIterator {aka boost::cb_details::iterator<boost::circular_buffer<Wrapper<int>::Sample, std::allocator<Wrapper<int>::Sample> >, boost::cb_details::nonconst_traits<std::allocator<Wrapper<int>::Sample> > >}’ requested    
                          [](const Sample& a, const Sample& b) { return a.foo < b.foo; });

那么,为什么这个函数不能成为const?为什么标记为const会产生这种副作用?我想在容器中使用非const迭代器,但在我的实际测试用例中,我并不打算实际修改容器。

2 个答案:

答案 0 :(得分:7)

您需要F5,因为您实际上是在观察const_iterator容器。

也许:

const

...然后将typedef typename boost::circular_buffer<Sample>::const_iterator MyConstIterator; 作为其中之一。

有人会告诉你,你可以通过iter避免这种情况。这是真的,但是你永远不会发现这个“错误”,或auto存在。

答案 1 :(得分:4)

如果您的功能已标记为const,那么您对成员变量的所有访问权限也将为const

const容器只允许访问const_迭代器,这就像迭代器的工作方式一样。