decltype и круглые скобки

Я не понимаю последнюю строку примера на странице 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 как в строке выше?

49
задан TemplateRex 8 June 2014 в 19:40
поделиться

3 ответа

Чуть выше этого примера написано

  • , что если e - это выражение id без скобок или доступ к члену класса (5.2.5), decltype (e) - это тип сущности, названной e.
  • если e - это lvalue, decltype (e) - это T &, где T - это тип e;

Я думаю, что decltype (a-> x) является примером члена класса доступ "и decltype ((a-> x)) является примером lvalue.

39
ответ дан 7 November 2019 в 11:50
поделиться

Добавленные скобки превращают его в lvalue.

В MSDN сказано:
Внутренние круглые скобки приводят к тому, что оператор оценивается как выражение, а не как доступ к члену. И поскольку a объявлен как указатель const, тип является ссылкой на const double.

11
ответ дан 7 November 2019 в 11:50
поделиться
decltype(a->x)

Это дает вам тип переменной-члена A::x, которая является double.

decltype((a->x))

Это дает вам тип выражения (a->x), которое является lvalue выражением (поэтому оно является const ссылкой - a является const A*).

18
ответ дан 7 November 2019 в 11:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: