Ce face std::is_same
std::is_same_v<T, U> este true doar dacă T și U sunt identice, inclusiv const și referințe: int și const int sunt tipuri diferite. Rezultatul se calculează la compilare, deci se poate folosi în static_assert și if constexpr.
Este folosit în șabloane pentru a trata special un anumit tip și pentru a verifica ce tip deduce auto sau decltype. Varianta cu concept, din C++20, este std::same_as.
Parametri
| Parametru | Descriere |
|---|---|
T, U |
Tipurile comparate. |
Ce returnează
O constantă bool la compilare.
Exemple
Exemplul 1: Ce tipuri sunt identice
#include <cstdint>
#include <print>
#include <string>
#include <type_traits>
int main() {
std::println("int și int: {}", std::is_same_v<int, int>);
std::println("int și const int: {}", std::is_same_v<int, const int>);
std::println("int și long: {}", std::is_same_v<int, long>);
std::println("int32_t și int: {}", std::is_same_v<std::int32_t, int>);
auto x = 2.5f;
std::println("auto x = 2.5f este float: {}", std::is_same_v<decltype(x), float>);
static_assert(std::is_same_v<std::string::size_type, std::size_t>);
}
Rezultat
int și int: true
int și const int: false
int și long: false
int32_t și int: true
auto x = 2.5f este float: true
Exemplul 2: Tratare specială într-un șablon
#include <print>
#include <string>
#include <type_traits>
template <class T>
void descrie(const T& valoare) {
if constexpr (std::is_same_v<T, std::string>) {
std::println("text de {} caractere: {}", valoare.size(), valoare);
} else if constexpr (std::is_same_v<T, bool>) {
std::println("da/nu: {}", valoare ? "da" : "nu");
} else {
std::println("altă valoare: {}", valoare);
}
}
int main() {
descrie(std::string("Cluj"));
descrie(true);
descrie(3.5);
}
Rezultat
text de 4 caractere: Cluj
da/nu: da
altă valoare: 3.5
Greșeli frecvente
- Compari un tip dedus din parametru cu
std::is_same_v<T, int>, darTesteint&sauconst int. Rezultatul estefalse; elimină întâi calificativele custd::remove_cvref_tsaustd::decay_t.
Comenzi înrudite
std::same_as: Concepte C++20: same_as cere exact același tip, convertible_to cere un tip care se poate converti în altul.decltype: Dă tipul exact al unei expresii, fără să o evalueze; util pentru a declara variabile „de același tip ca”.if constexpr: Un if evaluat la compilare: ramura falsă este eliminată complet, deci poate conține cod care nu s-ar compila pentru tipul curent.static_assert: Verifică o condiție la compilare; dacă este falsă, compilarea se oprește cu mesajul dat.std::remove_reference: remove_reference scoate referința dintr-un tip; decay îl transformă ca la transmiterea prin valoare.