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 typT&pre typT. - Ak je výraz rvalue,
decltype(expr)vráti typTpre typT. - Výnimka: ak je výraz v zátvorkách a je to názov premennej alebo člen triedy,
decltypevrá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) - Ak je výraz lvalue,
decltype vypočíta typ výrazu v čase kompilácie, bez jeho vyhodnotenia.