std::addressof (3) Linux Manual Page
std::addressof – std::addressof
Synopsis
Defined in header<memory>
template <class T>
(since C++ 11)
T *addressof(T &arg) noexcept;
(until C++ 17)
template <class T>
(1)(since C++ 17)
constexpr T *addressof(T &arg) noexcept;
template <class T>
(2)(since C++ 17)
const T *addressof(const T &&) = delete;
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.
Possible implementation
Note: the above implementation is_oversimplified and is not constexpr (which requires compiler support).
Example
operator& may be overloaded for a pointer wrapper class to obtain a pointer to pointer:
// Run this code
#include <iostream>
#include <memory>
template <class T>
struct Ptr {
T *pad; // add pad to show difference between 'this' and 'data'
T *data;
Ptr(T *arg)
: pad(nullptr), data(arg)
{
std::cout << "Ctor this = " << this << std::endl;
}
~Ptr()
{
delete data;
}
T **operator&()
{
return &data;
}
};
template <class T>
void f(Ptr<T> *p)
{
std::cout << "Ptr overload called with p = " << p << '\n';
}
void f(int **p)
{
std::cout << "int** overload called with p = " << p << '\n';
}
int main()
{
Ptr<int> p(new int(42));
f(&p); // calls int** overload
f(std::addressof(p)); // calls Ptr<int>* overload, (= this)
}
Possible output:
See also
allocator (class template)
pointer_to obtains a dereferenceable pointer to its argument
[static]
