Как работает addressof функция?

110
01 августа 2019, 15:30
#include <iostream>
class A
{}; 
  template <class T>
    T * addressof(T & v)
    {
      return reinterpret_cast<T *>(& const_cast<char&>(reinterpret_cast<const volatile char &>(v)));
    }
int main()
{
    A a;
    std::cout<<&a<<std::endl;
    std::cout<<addressof(a)<<std::endl;
    return 0;
}

output:

0x7a9ba88cd79f

0x7a9ba88cd79f

Данная функция возвращает адрес объекта, интересно, как она работает?

Answer 1

Вопрос, как я понимаю, в расшифровке всех этих кастов, и почему используются именно они. А суть самого std::addressof, чтобы иметь возможность получить адрес объекта, даже если для типа объекта перегружен оператор взятия адреса operator&.

Первый каст reinterpret_cast<const volatile char&>(arg))) делает низкоуровневое преобразование к символьному типу char (минимально адресуемый тип, т.к. его размер по определению равен единице) с добавлением объекту const и volative специфичности. Если не добавить const и volatile, то не получится работать с const и volatile объектами соответственно.

Второй каст const_cast<char&> убирает свежедобавленные const и volatile, чтобы подготовить плацдарм для третьего каста. Тут ещё можно заметить взятие адреса &, которое уже не может быть перегружено, ибо оперирует со встроенным типом char и даёт в итоге указатель на char.

Итоговый каст reinterpret_cast<T*> собственно приводит тип к необходимому типу объекта.

READ ALSO
Функции вызывают друг друга с++

Функции вызывают друг друга с++

Я совсем поверхностно знаю с++, но эту проблему мне необходимо срочно решить(нет времени на прочтение книги)

98
Global Libraries как зависимость Gradle в IDEA

Global Libraries как зависимость Gradle в IDEA

Есть некие глобальные библиотеки заданные в IDEA, могу ли я их подключить в buildgradle? Если я подключаю их вручную, то они сбрасываются при первом...

122
Массив огромных размеров [закрыт]

Массив огромных размеров [закрыт]

Есть олимпиадная задача, ограничение по памяти 256 мебибайтНужно создать матрицу 100000 х 100000

93