Boost logo

Boost :

Subject: [boost] [core] [addressof.hpp] [addressof_test2.cpp] ISO C++ says that these are ambiguous
From: Sergey Sprogis (sergey.sprogis_at_[hidden])
Date: 2014-12-24 19:43:39


It looks like he following code fragment from boost/core/addressof.hpp
(latest trunk version) violates ISO C++ overloading rules:

template<class T> struct addressof_impl
{
     static BOOST_FORCEINLINE T * f( T & v, long )
     {
         return reinterpret_cast<T*>(
&const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
     }
     static BOOST_FORCEINLINE T * f( T * v, int )
     {
         return v;
     }
};

As a result, libs/core/test/addressof_test2.cpp fails to compile with
Oracle Studio 12.4 C++ compiler while gcc-4.8.2 produces just warning here.
It's easy to reproduce that behavior of both compilers with 26 lines
test case listed below:

gcc -c t.cc
t.cc:7:33: warning: ISO C++ says that these are ambiguous, even though
the worst conversion for the first is better than the worst conversion
for the second: [enabled by default]
   return addressof_impl<T>::f(v,0);
              ^
CC -c t.cc
"t.cc", line 7: Error: Overloading ambiguity between "static
addressof_impl<convertible2>::f(convertible2&, long)" and "static
addressof_impl<convertible2>::f(convertible2*, int)".

t.cc
====================================
template<class T> struct addressof_impl{
  static T *f(T &v,long){}
  static T *f(T *v,int){}
};
template<class T> T *addressof(T &v){
  return addressof_impl<T>::f(v,0);
}
template<class T> void scalar_test(T* =0){
  T *px=new T();
  T &x =*px;
  (addressof(x)==px)? 1 : 0;
}
class convertible{
  public: convertible(int=0){}
};
class convertible2{
  public:
   convertible2(int=0){}
   operator convertible2 *()const{
    return 0;
   }
};
void foo(){
  scalar_test<convertible>();
  scalar_test<convertible2>();
}
==============================

It would be nice if boost/core/addressof.hpp file will be changed
somehow to fit the proper ISO C++ requirements.

Sergey


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk