Std:: addressof - странная реализация

Итак, несколько дней назад я узнал о std:: addressof. В http://en.cppreference.com/w/cpp/memory/addressof приведена возможная реализация:

template< class T >
T* addressof(T& arg) 
{
    return reinterpret_cast<T*>(
               &const_cast<char&>(
                  reinterpret_cast<const volatile char&>(arg)));
}

Насколько я вижу, это можно просто реализовать, например:

template<typename T>
T* addressof( T& var )
{
    return &var;
}

Почему ребята из cppreference решили реализовать его с помощью 3-х бросков? Есть ли какие-то детали, которые мне не хватает, что улучшает их реализацию. В чем смысл использования изменчивости, когда вы делаете это?

Ответ 1

Если он может быть реализован, как в вашем примере, ему не понадобится. Дело в том, что он дает вам адрес объекта, даже если адрес operator& для этого типа был перегружен.