Оценка ссылочного выражения

В соответствии с предложением @Potatoswatter, я создал новое обсуждение.

Ссылка этот ответ от @Potatoswatter

Учитывая фрагмент кода,

int i = 3, &j = i; 
j = ++ i;

Комментарий, который я проясняю, это. (что, кажется, является важной недостающей частью в моем понимании неопределенной оценки точки последовательности a.k.a):

@Chubsdad: Несмотря на то что это псевдоним, его оценка glvalue не требуется оценка gl-значения i. Вообще говоря, оценка ссылка не требует оригинальный объект, который будет под рукой.. нет причин, по которым он должен быть UB, поэтому он делает смысл должен быть легкой лазейкой или преобразование в код, который не является UB.

и

Ссылка не сообщает компилятор, чтобы посмотреть на ссылку переменной и получить ее значение lvalue, потому что он может не знать, какая переменная ссылки. Компилятор вычисляет lvalue ссылки и что lvalue идентифицирует объект. если ты хочу обсудить это дальше, пожалуйста откройте новый вопрос.

Любое возможное отсутствие ясности в вопросе является частью поведения "undefined". Я пытаюсь понять "неощутимую оценку", "точку последовательности" и т.д. в С++ 0x.

Ответы

Ответ 1

Представьте себе следующее

int &i = *new int;

Если вы говорите, что i является псевдонимом для другого имени - какое имя? Ссылка ссылается на объект или функцию. Когда вы говорите "glvalue", вы ссылаетесь на свойство определенного выражения, а не на свойство объекта.

int i = 0;
int &ri = i;

Теперь i является выражением lvalue, а ri также является значением lvalue (оба синтаксической категории id-expression). Они называют (как найдено по имени) ссылку и переменную int.

Если теперь определить идентификатор объекта для случая ri, вам нужно взять ссылку и сделать выражение ссылкой на объект, с которым он был инициализирован. Это называется оценкой lvalue, потому что вы определяете свойство lvalue (т.е. референт).

Вам нужно сделать то же самое для случая i. I.e вы выясните, к какому объекту относится выражение lvalue i. Оценка gl ri, таким образом, отличается от оценки значения gl i, несмотря на то, что оба они дают одинаковый результат.

Оценка R означает, что нужно взять значение lvalue и применить lvalue к преобразованию rvalue. Другими словами, чтобы прочитать значение.

Ответ 2

Концептуально ссылка в С++ является псевдонимом или альтернативным именем для некоторого объекта. Именно эта концепция должна служить вам при интерпретации языковых правил, когда речь идет о ссылках.

Существуют два способа реализации ссылок на С++:

  • Как аннотация в таблице символов компилятора. Это возможно только в том случае, если ссылка привязана только к одному объекту, но она также находится ближе всего к понятию ссылки. IMO, большинство компиляторов используют эту технику, когда это возможно, например, в представленном здесь примере.
  • Как указатель, который автоматически разыгрывается при каждой операции. Это решение отпадает, поскольку оно не совпадает с эталонной концепцией, но облегчает реализацию параметров функции ссылочного типа без существенного изменения ABI.

В представленном примере никогда не может быть ссылки j, которая не привязана к объекту i, поэтому компилятор, скорее всего, будет использовать метод аннотации таблицы символов для реализации ссылки. Это означает, что после объявления как i, так и j они могут быть взаимозаменяемы в коде без какого-либо влияния на сгенерированный код или на вопрос, определено ли поведение.