Функция addressof
Функция addressof возвращает действительный
адрес объекта в памяти. Её главная особенность
заключается в том, что она работает корректно
даже в том случае, если для типа объекта
переопределён оператор взятия адреса operator&.
В единственный параметр мы передаём ссылку на
объект, адрес которого необходимо получить.
Функция возвращает указатель на этот объект.
Синтаксис
#include <memory>
std::addressof(obj)
Пример
Давайте получим адрес обычной переменной и выведем его на экран:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
int num = 42;
int* ptr = std::addressof(num);
cout << *ptr << endl;
return 0;
}
Результат выполнения кода:
42
Пример
Давайте рассмотрим случай, когда в классе
переопределён оператор operator&.
Обычное взятие адреса вернёт подставное
значение, а addressof - настоящий адрес:
#include <iostream>
#include <memory>
using namespace std;
struct Obj
{
int value = 5;
Obj* operator&()
{
return nullptr;
}
};
int main()
{
Obj obj;
cout << &obj << endl;
cout << std::addressof(obj) << endl;
return 0;
}
Результат выполнения кода:
0
"0x7ffee4b8c9a0"
Первый вывод равен 0, так как сработал
переопределённый оператор. Второй вывод -
это реальный адрес объекта в памяти
(значение может отличаться при каждом запуске).
Смотрите также
-
функция
construct_at,
которая создаёт объект по указанному адресу -
функция
destroy_at,
которая разрушает объект по указанному адресу -
функция
launder,
которая получает корректный указатель на объект -
оператор
new,
который выделяет память под объект