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?
c
is the name of a variable;
(c)
is an expression, in this case an lvalue expression, whose value is identical to the value of the variable c
.
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.