Boost logo

Boost Users :

Subject: [Boost-users] boost::addressof
From: Stanisław Findeisen (stf_at_[hidden])
Date: 2010-08-31 17:11:59


In the latest boost release (1.44) boost::addressof is defined as
follows (boost/utility/addressof.hpp):

namespace detail

template<class T> struct addr_impl_ref
    T & v_;

    inline addr_impl_ref( T & v ): v_( v ) {}
    inline operator T& () const { return v_; }

    addr_impl_ref & operator=(const addr_impl_ref &);

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

    static inline T * f( T * v, int )
        return v;

} // namespace detail

template<class T> T * addressof( T & v )
#if defined( __BORLANDC__ ) && BOOST_WORKAROUND( __BORLANDC__,
BOOST_TESTED_AT( 0x610 ) )

    return boost::detail::addressof_impl<T>::f( v, 0 );


    return boost::detail::addressof_impl<T>::f(
boost::detail::addr_impl_ref<T>( v ), 0 );


Q1: What is volatile in the cast needed for?

Q2: Could anyone please explain to me what are the 2nd parameters in
each of the f functions in struct addressof_impl for?

Q3: What is struct addr_impl_ref::operator T& () const ??! I understand
it is there to get called when passing addr_impl_ref<T>(v) instead of v
to addressof_impl<T>::f, but I've never seen such a thing before. I
would understand T& struct addr_impl_ref::operator(), or something, but
this one is different. Sorry if this is a newbie question.

Q4: I can see that in 1.34.1 boost::addressof was much more simple:

// VC7 strips const from nested classes unless we add indirection here

template<class T> struct _addp
    typedef T * type;

template <typename T> typename _addp<T>::type

# else
template <typename T> T*
# endif
addressof(T& v)
  return reinterpret_cast<T*>(
       &const_cast<char&>(reinterpret_cast<const volatile char &>(v)));

so I wonder what was the problem with this design?...

OpenPGP: DFD9 0146 3794 9CF6 17EA  D63F DBF5 8AA8 3B31 FE8A
Like Hardship, Risk & Challenge?  --- Follow Jesus!!

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at