в соответствии с http://en.cppreference.com/w/cpp/language/decltype
struct A {
double x;
};
const A* a = new A();
decltype( a->x ) x3;
случай соответствия 1, то есть:
Если аргумент является либо именем объекта / функции, не заключенным в скобки, либо выражением доступа к члену (object.member или pointer-> member), тогда decltype
определяет объявленный тип объекта, указанный этим выражением.
но это примечание:
если имя объекта заключено в скобки, оно становится выражением lvalue
привести меня к следующему вопросу: каков тип a->x
если это не выражение lvalue?
Я даже не понимаю почему
decltype((a->x)) x4 = x3; // type of x4 is const double& (lvalue expression)
оценивается как const&
только из-за того, что оно считается выражением lvalue, на самом деле не вижу ссылки.
привести меня к следующему вопросу, каков тип a-> x, если это не выражение lvalue?
Вы просто запутались.
если имя объекта заключено в скобки, оно становится выражением lvalue
Которые должны быть
если имя объекта заключено в скобки, оно обрабатывается по-разному в соответствии с типом decltype.
И заключенные в скобки и не заключенные в скобки вещи являются выражениями lvalue. Если вы не заключите в скобки, тогда decltype не проверяет тип выражения, но тип, используемый объявлением, что поиск имени нашел имя, на которое ссылается (например, это может быть int&&
если поиск имени разрешает его в ссылочную переменную rvalue, но тип выражения int
и является именующий).
Способ думать об этом (ИМХО) это:
decltype( a->x )
хранит / извлекает информацию, которая x
ссылается на переменную-член, следовательно, он дает вам объявленный тип переменной-члена. Это полезно, потому что вы не могли бы извлечь эту информацию, если бы это автоматически превратилось в следующий случай:
decltype( (a->x) )
Это «просто» выражение и поэтому ведет себя как любое другое выражение. Это относится к любому выражению возвращается, не то, что выражение Рекомендации. Выражение является lvalue, не имеет значения, что это переменная-член. Вы явно выбрасывать часть информации это доступно, выражая ваше намерение не интересоваться тем, как был объявлен объект / член, а только результирующим типом выражения.
Другими словами: первый синтаксис дает вам Больше информация, если вы эксплицитно решите, что они вам не нужны, и используйте второй синтаксис.