#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
Данная функция возвращает адрес объекта, интересно, как она работает?
Вопрос, как я понимаю, в расшифровке всех этих кастов, и почему используются именно они. А суть самого 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*>
собственно приводит тип к необходимому типу объекта.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Я совсем поверхностно знаю с++, но эту проблему мне необходимо срочно решить(нет времени на прочтение книги)
Есть некие глобальные библиотеки заданные в IDEA, могу ли я их подключить в buildgradle? Если я подключаю их вручную, то они сбрасываются при первом...
Есть олимпиадная задача, ограничение по памяти 256 мебибайтНужно создать матрицу 100000 х 100000