Оценка ссылочного выражения - PullRequest
2 голосов
/ 06 октября 2010

По предложению @ Potatoswatter я создал новую дискуссию.

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

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

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

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

@ Чубсдад: Хотя это псевдоним, его оценка Требуется оценка glvalue I. Вообще говоря, оценивая ссылка не требует оригинальный объект под рукой. Там есть нет причин, это должно быть UB, поэтому он делает смысл должен быть легкой лазейкой или преобразование в код, который не UB.

и

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

Любое возможное отсутствие ясности в этом вопросе является частью «неопределенного поведения», через которое я пытаюсь понять «непоследовательную оценку», «точку последовательности» и т. Д. В C ++ 0x.

Ответы [ 2 ]

2 голосов
/ 06 октября 2010

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

int &i = *new int;

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

int i = 0;
int &ri = i;

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

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

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

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

1 голос
/ 06 октября 2010

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

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

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

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

...