std::as_const în C++

Returnează o referință const la un obiect, ca să fie folosite variantele const ale metodelor.

Sintaxă
#include <utility>
template<class T>
constexpr std::add_const_t<T>& as_const(T& t) noexcept;

Ce face std::as_const

std::as_const(x) este echivalent cu static_cast<const T&>(x), dar mai scurt. Obiectul nu este copiat: primești o referință prin care nu îl poți modifica.

Este util când un tip are metode în două variante (const și non-const) și vrei să o alegi pe cea const, de exemplu pentru a obține iteratori de citire sau pentru a evita ca operator[] dintr-un std::map să insereze elemente.

Parametri

Parametru Descriere
t Obiectul pentru care vrei o referință const.

Ce returnează

O referință const T& la același obiect.

Exemple

Exemplul 1: Alegerea variantei const a unei metode

#include <print>
#include <utility>

struct Document {
    void citeste() { std::println("versiunea care poate modifica"); }
    void citeste() const { std::println("versiunea doar pentru citire"); }
};

int main() {
    Document d;
    d.citeste();
    std::as_const(d).citeste();
}

Rezultat

versiunea care poate modifica
versiunea doar pentru citire

Exemplul 2: Iterare doar pentru citire

În lambda, v este o referință const: încercarea de a modifica elementele nu ar compila.

#include <print>
#include <utility>
#include <vector>

int main() {
    std::vector<int> note{9, 7, 10};
    for (const int& n : std::as_const(note)) {
        std::print("{} ", n);
    }
    std::println();
}

Rezultat

9 7 10

Greșeli frecvente

  • Scrii std::as_const(f()) cu un temporar. Varianta pentru rvalue este ștearsă (deleted), ca să nu rămâi cu o referință la un obiect distrus.

Comenzi înrudite

  • const: Marchează o valoare care nu mai poate fi modificată după inițializare; compilatorul oprește orice încercare de schimbare.
  • static_cast, dynamic_cast, const_cast, reinterpret_cast: Cele patru conversii explicite: static_cast (obișnuite), dynamic_cast (clase), const_cast (const) și reinterpret_cast (biți).
  • std::forward: Transmite un argument mai departe păstrând felul lui: valoare temporară (mutabilă) sau variabilă cu nume.