[SVN r35101]
This commit is contained in:
Dave Abrahams
2006-09-13 22:24:14 +00:00
parent b7283c93c6
commit 70ef2f0e81
2 changed files with 39 additions and 4 deletions

View File

@ -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

View File

@ -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;
}