decltype и скобки
-
29-09-2019 - |
Вопрос
Я не понимаю последнюю строку примера на стр. 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.