请参见http://coliru.stacked-crooked.com/a/b164340b70de1770
中的示例 boost::iterator_facade::operator[]
定义为:
typename boost::detail::operator_brackets_result<Derived,Value,reference>::type
operator[](difference_type n) const
{
typedef boost::detail::use_operator_brackets_proxy<Value,Reference> use_proxy;
return boost::detail::make_operator_brackets_result<Derived>(
this->derived() + n
, use_proxy()
);
}
但是boost::iterator_range::operator[]
被定义为:
reference operator[]( difference_type at ) const
{
BOOST_ASSERT( at >= 0 && at < size() );
return m_Begin[at];
}
现在存在问题,因为iterator_range::operator[]
可能返回对iterator_facade::operator[]
创建的临时对象的引用。例如,boost::reversed_range<const std::vector<int>>::operator[]
具有这种行为。
我已阅读https://www.boost.org/doc/libs/1_68_0/libs/iterator/doc/iterator_facade.html#operator中的说明,但仍然无法理解。