Вопрос

Я не понимаю последнюю строку примера на стр. 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 - это нерецентированное идентификационное выражение или доступ класса элементов (5.2.5), DECLTYPE (E) является типом объекта, именованного e.
  • Если E - это Lvalue, DECLTYPE (E) является T &, где t - это тип e;

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

Другие советы

decltype(a->x)

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

decltype((a->x))

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

Добавленные пары превращают его в Lvalue.

MSDN говорит
Внутренние скобки вызывают оценку оператора в качестве выражения вместо доступа к участнику. И потому, что A объявляется как указатель Const, тип является ссылкой на Const Double.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top