Sobes.tech
Middle

Na čo sa používa kľúčové slovo decltype v C++?

sobes.tech AI

Odpoveď od AI

decltype sa používa na získanie typu výrazu.

Hlavné prípady použitia:

  • Definovanie návratového typu funkcie po zozname parametrov ( trailing return type ):

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

    Toto umožňuje definovať návratový typ na základe výrazu, ktorý zahŕňa parametre funkcie.

  • Získanie typu premennej:

    int x = 10;
    decltype(x) y; // y má typ int
    
  • Získanie typu výrazu (nie nevyhnutne premennej):

    const int ci = 0;
    decltype(ci) z; // z má typ const int
    
    struct S { double d; };
    S s;
    decltype(s.d) val; // val má typ double
    
    int arr[5];
    decltype(arr[0]) elem; // elem má typ int
    
    int& ref_int();
    decltype(ref_int()) r = ref_int(); // r má typ int&
    
  • V metaprogramovaní s šablonami: Umožňuje definovať typy v rámci šablónových konštrukcií.

  • Vzťah s kategóriami výrazov (lvalue/rvalue):

    • Ak je výraz lvalue, decltype(expr) vráti typ T& pre typ T.
    • Ak je výraz rvalue, decltype(expr) vráti typ T pre typ T.
    • Výnimka: ak je výraz v zátvorkách a je to názov premennej alebo člen triedy, decltype vráti jeho deklarovaný typ (T), bez ohľadu na to, či je lvalue alebo nie.
    int i = 0;
    decltype(i) t1;     // int (názov premennej)
    decltype((i)) t2;   // int& (lvalue výraz v zátvorkách)
    
    int&& rv_ref = 5;
    decltype(rv_ref) t3; // int&& (názov premennej rvalue referencie)
    decltype((rv_ref)) t4; // int&& (lvalue výraz rvalue referencie v zátvorkách)
    

decltype vypočíta typ výrazu v čase kompilácie, bez jeho vyhodnotenia.