Ответ 1
Унарный operator&
может быть перегружен для типов классов, чтобы дать вам нечто иное, кроме адреса объекта, в то время как std::addressof()
всегда будет указывать ваш фактический адрес.
Продуманный пример:
#include <memory>
#include <iostream>
struct A {
A* operator &() {return nullptr;}
};
int main () {
A a;
std::cout << &a << '\n'; // Prints 0
std::cout << std::addressof(a); // Prints a actual address
}
Если вам интересно, когда это полезно:
Какие существуют законные причины для переустановки унарного оператора &?