Sobes.tech
Middle

Mit használ a decltype kulcsszó a C++-ban?

sobes.tech MI

Válasz az MI-től

A decltype az kifejezés típusának meghatározására szolgál.

Fő felhasználási esetek:

  • A függvény visszatérési típusának meghatározása a paraméterlistát követően ( trailing return type ):

    template<typename T, typename U>
    auto add(T t, U u) -> decltype(t + u) {
        return t + u;
    }
    

    Ez lehetővé teszi a visszatérési típus meghatározását egy olyan kifejezés alapján, amely magában foglalja a függvény paramétereit.

  • Egy változó típusának meghatározása:

    int x = 10;
    decltype(x) y; // y típusa int
    
  • Egy kifejezés típusának meghatározása (nem feltétlenül változó):

    const int ci = 0;
    decltype(ci) z; // z típusa const int
    
    struct S { double d; };
    S s;
    decltype(s.d) val; // val típusa double
    
    int arr[5];
    decltype(arr[0]) elem; // elem típusa int
    
    int& ref_int();
    decltype(ref_int()) r = ref_int(); // r típusa int&
    
  • Metaprogramozásban sablonokkal: Lehetővé teszi típusok meghatározását sablonstruktúrákban.

  • Kapcsolat az kifejezéskategóriákkal (lvalue/rvalue):

    • Ha a kifejezés lvalue, akkor decltype(expr) a T& típust adja vissza a T típushoz.
    • Ha a kifejezés rvalue, akkor decltype(expr) a T típust adja vissza a T típushoz.
    • Kivétel: ha a kifejezés zárójelek között van, és egy változó vagy osztálytag neve, akkor a decltype a deklarált típusát (T) adja vissza, függetlenül attól, hogy lvalue vagy sem.
    int i = 0;
    decltype(i) t1;     // int (változó neve)
    decltype((i)) t2;   // int& (zárójelek közötti lvalue kifejezés)
    
    int&& rv_ref = 5;
    decltype(rv_ref) t3; // int&& (rvalue referencia típusú változó neve)
    decltype((rv_ref)) t4; // int&& (rvalue referencia típusú kifejezés zárójelek között)
    

decltype kiszámítja egy kifejezés típusát fordítási időben, anélkül, hogy értékelné azt.