Boost logo

Boost Users :

Subject: [Boost-users] [Fit] function object variables and ADL
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2016-03-14 18:27:36


Hi,

Fit library make use of constexpr function object. These function
objects don't work well when the user is requiring ADL and the same
symbol is used. Next follows an example

namespace N1 {
     struct F1 {
         void operator()(int) const {}
     };
     constexpr F1 f;
}

namespace N2 {
     struct A{};
     void f(A) {}
}

namespace N3 {
     struct A{};
     void f(A) {}
}

The following find N3::f(A)

     {
       N3::A a;
       f(a); // calls N3::f(A)
     }

Adding another namespace that doesn't introduce a better match works yet
{
       N3::A a;
       using namespace N2;
       f(a); // calls N3::f(A)
     }

However a namespace that contains a function object with the smae name
even if overload doesn't match make the code ill-formed

     {
       N3::A a;
       using namespace N1;
       f(a); // compile fails
     }

: error: reference to 'f' is ambiguous
       f(a);
       ^
: note: candidate found by name lookup is 'N1::f'
constexpr F1 f;
              ^
: note: candidate found by name lookup is 'N3::f'
   void f(A) {}

boost::fit contains a lot of such a function objects variables, so this
means that the user should be careful while introducing the namespace
boost::fit, as ADL will not be used for a lot of symbols.

This is not something specific to Fit library, Hana and range-v3 make
use of a lot of such global function objects.

A good stryle will be to use Fit/Hana function objects always qualified
with their respective namespapce or an alias.

I believe it will be worth adding something in the documentation
preventing the users of this case.

Best,
Vicente



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net