I haven't been able to find a good explanation of decltype. Please tell me, as a beginning programmer, what it does and why it is useful.
For example, I am reading a book that asked the following question. Can someone explain to me the answer and why, along with some good (beginner-level) examples?
What would be the type of each variable and what value would each variable have when the code finishes?
int a = 3, b = 4; decltype(a) c = a; decltype((b)) d = a; ++c; ++d;
A line-by-line explanation would be very helpful.
21 Answer
decltype is a way to specify a type: You give it an expression, and decltype gives you back a type which corresponds to the type of the expression. Specifically, decltype(e) is the following type:
If
eis the name of a variable, i.e. an "id-expression", then the resulting type is the type of the variable.Otherwise, if
eevaluates to an lvalue of typeT, then the resulting type isT &, and ifeevaluates to an rvalue of typeT, then the resulting type isT.
Combining these rules with reference collapsing rules allows you to make sense of decltype(e) &&, which is always a "suitable" reference. (C++14 also adds decltype(auto) to give you the type-deduction of auto combined with the value category semantics of decltype.)
Examples:
int foo(); int n = 10; decltype(n) a = 20; // a is an "int" [id-expression] decltype((n)) b = a; // b is an "int &" [(n) is an lvalue] decltype(foo()) c = foo(); // c is an "int" [rvalue] decltype(foo()) && r1 = foo(); // int && decltype((n)) && r2 = n; // int & [& && collapses to &] It might be worth stressing the difference between auto and decltype: auto works on types, and decltype works on expressions.
You shouldn't be seeing or using decltype in "day-to-day" programming. It is most useful in generic (templated) library code, where the expression in question is not known and depends on a paramater. (By contrast, auto may be used generously all over the place.) In short, if you're new to programming, you probably won't need to use decltype for some time.