I was reading this article on Wikipedia regarding C++11 Type Inference feature.
There is an example and I quote:
#include <vector>
int main() {
const std::vector<int> v(1);
auto a = v[0]; // a has type int
decltype(v[1]) b = 1; // b has type const int&, the return type of
// std::vector<int>::operator[](size_type) const
auto c = 0; // c has type int
auto d = c; // d has type int
decltype(c) e; // e has type int, the type of the entity named by c
decltype((c)) f = c; // f has type int&, because (c) is an lvalue
decltype(0) g; // g has type int, because 0 is an rvalue
}
in the following lines:
decltype(c) e; // e has type int, the type of the entity named by c
decltype((c)) f = c; // f has type int&, because (c) is an lvalue
What’s the difference between c and (c)? Why does (c) represent an lvalue?
cis the name of a variable;(c)is an expression, in this case an lvalue expression, whose value is identical to the value of the variablec.And the two are treated differently by
decltype. Consider, for example,decltype(1+2), which is also an example taking an expression. It just so happens that your example is a simple version of an expression: one which merely names a single variable and does nothing exciting with it.It’s one of those differences that you generally only really care about if you’re rationalising about the subtle parts of the language specification; though, as you have identified, it has quite a significant practical effect in this case.
Please note though that there is no operator usage here. It’s all simply a deduction from the layout of the grammar.