std::addressof

From cppreference.com
< cpp‎ | memory
 
 
 
Dynamic memory management
Uninitialized storage
(C++17)
(deprecated since c++17)
(deprecated since c++17)
(deprecated since c++17)
Garbage collection support
Miscellaneous
addressof
(C++11)
(C++11)
C Library
Low level memory management
 
Defined in header <memory>
(1)
template< class T >
T* addressof(T& arg);
(since C++11)
(until C++17)
template< class T >
constexpr T* addressof(T& arg);
(since C++17)
template <class T>
const T* addressof(const T&&) = delete;
(2) (since C++17)
1) Obtains the actual address of the object or function arg, even in presence of overloaded operator&
2) Rvalue overload is deleted to prevent taking the address of const rvalues.

The expression std::addressof(E) is a constant subexpression, if E is an lvalue constant subexpression.

(since C++17)

Parameters

arg - lvalue object or function

Return value

Pointer to arg.

Exceptions

1)
noexcept specification:  
noexcept
  

Possible implementation

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

Note: the above implementation is oversimplified and is not constexpr (which requires compiler support).