|
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