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.