Я не понимаю последнюю строку примера на странице 148 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&
Почему круглые скобки имеют значение здесь? Не был должен это просто быть double
как в строке выше?
Чуть выше этого примера написано
- , что если e - это выражение id без скобок или доступ к члену класса (5.2.5), decltype (e) - это тип сущности, названной e.
- если e - это lvalue, decltype (e) - это T &, где T - это тип e;
Я думаю, что decltype (a-> x)
является примером члена класса доступ "и decltype ((a-> x))
является примером lvalue.
Добавленные скобки превращают его в lvalue.
В MSDN сказано:
Внутренние круглые скобки приводят к тому, что оператор оценивается как выражение, а не как доступ к члену. И поскольку a объявлен как указатель const, тип является ссылкой на const double.
decltype(a->x)
Это дает вам тип переменной-члена A::x
, которая является double
.
decltype((a->x))
Это дает вам тип выражения (a->x)
, которое является lvalue выражением (поэтому оно является const ссылкой - a
является const A*
).