выражение decltype и lvalue

в соответствии с 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, на самом деле не вижу ссылки.

1

Решение

привести меня к следующему вопросу, каков тип a-> x, если это не выражение lvalue?

Вы просто запутались.

если имя объекта заключено в скобки, оно становится выражением lvalue

Которые должны быть

если имя объекта заключено в скобки, оно обрабатывается по-разному в соответствии с типом decltype.

И заключенные в скобки и не заключенные в скобки вещи являются выражениями lvalue. Если вы не заключите в скобки, тогда decltype не проверяет тип выражения, но тип, используемый объявлением, что поиск имени нашел имя, на которое ссылается (например, это может быть int&& если поиск имени разрешает его в ссылочную переменную rvalue, но тип выражения int и является именующий).

3

Другие решения

Способ думать об этом (ИМХО) это:

decltype( a->x )

хранит / извлекает информацию, которая x ссылается на переменную-член, следовательно, он дает вам объявленный тип переменной-члена. Это полезно, потому что вы не могли бы извлечь эту информацию, если бы это автоматически превратилось в следующий случай:

decltype( (a->x) )

Это «просто» выражение и поэтому ведет себя как любое другое выражение. Это относится к любому выражению возвращается, не то, что выражение Рекомендации. Выражение является lvalue, не имеет значения, что это переменная-член. Вы явно выбрасывать часть информации это доступно, выражая ваше намерение не интересоваться тем, как был объявлен объект / член, а только результирующим типом выражения.

Другими словами: первый синтаксис дает вам Больше информация, если вы эксплицитно решите, что они вам не нужны, и используйте второй синтаксис.

2

По вопросам рекламы [email protected]