Есть ли какое-либо преимущество в использовании шаблона функции std:: addressof() вместо использования оператора & (address of) в С++?

Если оператор address & работает хорошо, то почему С++ ввел функцию addressof()? Оператор & является частью С++ с самого начала - почему эта новая функция введена тогда? Имеет ли он какие-либо преимущества перед оператором C &?

Ответ 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
}

Если вам интересно, когда это полезно:
Какие существуют законные причины для переустановки унарного оператора &?