Boost logo

Boost :

Subject: [boost] Boost.Function comparison, again
From: David Abrahams (dave_at_[hidden])
Date: 2009-07-23 09:11:23

The docs say:

  When comparing against an instance of reference_wrapper, the address
  of the object in the reference_wrapper is compared against the address
  of the object stored by the function object wrapper:

  a_stateful_object so1, so2;
  f = boost::ref(so1);
  assert(f == boost::ref(so1));
  assert(f == so1); // Only if a_stateful_object is EqualityComparable
  assert(f != boost::ref(so2));

I take it from the above that

  so1 == so2 implies f == so2
  function_equal(so1,so2) implies f == so2

? Neither one of those is made entirely clear from the above.

It appears that the library assumes a function object may be _stored_ by ref

  f = boost::ref(so1);

for efficiency reasons, but will only be _compared_ by ref

  assert(f == boost::ref(so1));

because so1 is stateful. What is the rationale for this asymmetry? Is
there a role for the is_stateless type trait in smoothing over these
bumps? Seems to me that if you know the type is stateless, comparing
addresses isn't very useful.


Dave Abrahams
BoostPro Computing

Boost list run by bdawes at, gregod at, cpdaniel at, john at