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 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
"", line 7: Error: Overloading ambiguity between "static
addressof_impl<convertible2>::f(convertible2&, long)" and "static
addressof_impl<convertible2>::f(convertible2*, int)".
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{
   operator convertible2 *()const{
    return 0;
void foo(){

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


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