decltype and parentheses

C++C++11Type InferenceDecltype

C++ Problem Overview


I don't understand the last line of the example on page 148 of the FCD (§7.6.1.2/4):

const int&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = i;     // type is const int&&
decltype(i) x2;             // type is int
decltype(a->x) x3;          // type is double
decltype((a->x)) x4 = x3;   // type is const double&

Why do the parentheses make a difference here? Shouldn't it simply be double like in the line above?

C++ Solutions


Solution 1 - C++

Just above that example, it says

> - if e is an unparenthesized id-expression or a class member access (5.2.5), decltype(e) is the type of the entity named by e. > - if e is an lvalue, decltype(e) is T&, where T is the type of e;

I think decltype(a->x) is an example of the "class member access" and decltype((a->x)) is an example of lvalue.

Solution 2 - C++

decltype(a->x)

This gives you the type of the member variable A::x, which is double.

decltype((a->x))

This gives you the type of the expression (a->x), which is an lvalue expression (hence why it is a const reference--a is a const A*).

Solution 3 - C++

The added parens are turning it into a lvalue.

MSDN says
The inner parentheses cause the statement to be evaluated as an expression instead of a member access. And because a is declared as a const pointer, the type is a reference to const double.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionfredoverflowView Question on Stackoverflow
Solution 1 - C++CubbiView Answer on Stackoverflow
Solution 2 - C++James McNellisView Answer on Stackoverflow
Solution 3 - C++Greg DomjanView Answer on Stackoverflow