[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 // operator->() needs special support for input iterators to strictly meet the
// standard's requirements. If *i is not a reference type, we must still // 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. // returning an instantiation of this special proxy class template.
template <class T> template <class T>
struct operator_arrow_proxy struct operator_arrow_proxy
{ {
operator_arrow_proxy(T const* px) : m_value(*px) {} 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-> // This function is needed for MWCW and BCC, which won't call operator->
// again automatically per 13.3.1.2 para 8 // again automatically per 13.3.1.2 para 8
operator const T*() const { return &m_value; } operator T*() const { return &m_value; }
T m_value; mutable T m_value;
}; };
// A metafunction that gets the result type for operator->. Also // A metafunction that gets the result type for operator->. Also

View File

@ -57,6 +57,34 @@ struct proxy
int& state; 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 main()
{ {
int state = 0; int state = 0;
@ -65,5 +93,12 @@ int main()
boost::readable_iterator_test(counter_iterator<proxy>(&state), 3); boost::readable_iterator_test(counter_iterator<proxy>(&state), 3);
boost::writable_iterator_test(counter_iterator<proxy>(&state), 9, 7); boost::writable_iterator_test(counter_iterator<proxy>(&state), 9, 7);
BOOST_ASSERT(state == 8); 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; return 0;
} }