std::addressof în C++

Returnează adresa reală a unui obiect, chiar dacă clasa lui a redefinit operatorul &.

Sintaxă
template<class T>
constexpr T* addressof(T& obiect) noexcept;

Ce face std::addressof

De obicei adresa unui obiect se ia cu &x. O clasă poate însă redefini operator& să returneze altceva. std::addressof(x) returnează mereu adresa adevărată.

În codul obișnuit &x este suficient. std::addressof se folosește în cod generic (șabloane, containere), care trebuie să funcționeze cu orice tip.

Parametri

Parametru Descriere
obiect Obiectul a cărui adresă o vrei.

Ce returnează

Un pointer T* la obiect.

Exemple

Exemplul 1: O clasă care redefinește operatorul &

Adresele exacte diferă la fiecare rulare, așa că exemplul compară pointerii în loc să-i afișeze.

#include <memory>
#include <print>

struct Ciudat {
    int valoare = 5;
    Ciudat* operator&() { return nullptr; }   // nu face asta în codul tău
};

int main() {
    Ciudat c;
    Ciudat* p1 = &c;
    Ciudat* p2 = std::addressof(c);

    std::println("&c este nullptr: {}", p1 == nullptr);
    std::println("addressof(c)->valoare: {}", p2->valoare);
}

Rezultat

&c este nullptr: true
addressof(c)->valoare: 5

Greșeli frecvente

  • Crezi că addressof este necesar peste tot. Pentru tipurile tale obișnuite, &x face același lucru.

Comenzi înrudite

  • pointeri (*, &): Un pointer este o variabilă care ține adresa altei variabile; prin el poți citi și modifica valoarea de la acea adresă.
  • operator: Definește ce face un operator (+, ==, <<, [], () etc.) pentru tipurile tale, ca obiectele să se folosească la fel de natural ca numerele.
  • std::allocator: Alocatorul implicit al containerelor: rezervă și eliberează memorie brută pentru obiecte de tip T.