mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-23 17:37:15 +02:00
@ -293,17 +293,17 @@ namespace boost
|
||||
|
||||
// operator->() needs special support for input iterators to strictly meet the
|
||||
// standard's requirements. If *i is not a reference type, we must still
|
||||
// produce a (constant) lvalue to which a pointer can be formed. We do that by
|
||||
// produce a lvalue to which a pointer can be formed. We do that by
|
||||
// returning an instantiation of this special proxy class template.
|
||||
template <class T>
|
||||
struct operator_arrow_proxy
|
||||
{
|
||||
operator_arrow_proxy(T const* px) : m_value(*px) {}
|
||||
const T* operator->() const { return &m_value; }
|
||||
T* operator->() const { return &m_value; }
|
||||
// This function is needed for MWCW and BCC, which won't call operator->
|
||||
// again automatically per 13.3.1.2 para 8
|
||||
operator const T*() const { return &m_value; }
|
||||
T m_value;
|
||||
operator T*() const { return &m_value; }
|
||||
mutable T m_value;
|
||||
};
|
||||
|
||||
// A metafunction that gets the result type for operator->. Also
|
||||
|
@ -57,6 +57,34 @@ struct proxy
|
||||
int& state;
|
||||
};
|
||||
|
||||
struct value { int x; };
|
||||
|
||||
struct input_iter
|
||||
: boost::iterator_facade<
|
||||
input_iter
|
||||
, value
|
||||
, boost::single_pass_traversal_tag
|
||||
, value
|
||||
>
|
||||
{
|
||||
public:
|
||||
input_iter() {}
|
||||
|
||||
void increment()
|
||||
{
|
||||
}
|
||||
value
|
||||
dereference() const
|
||||
{
|
||||
return value();
|
||||
}
|
||||
|
||||
bool equal(input_iter const& y) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
int state = 0;
|
||||
@ -65,5 +93,12 @@ int main()
|
||||
boost::readable_iterator_test(counter_iterator<proxy>(&state), 3);
|
||||
boost::writable_iterator_test(counter_iterator<proxy>(&state), 9, 7);
|
||||
BOOST_ASSERT(state == 8);
|
||||
|
||||
// test for a fix to http://tinyurl.com/zuohe
|
||||
// These two lines should be equivalent (and both compile)
|
||||
input_iter p;
|
||||
(*p).x = 2;
|
||||
p->x = 2;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user