Можно ли одной ссылке присвоить разные значения в разных местах? - PullRequest
1 голос
/ 21 декабря 2011
#include <iostream>
using namespace std;

int main ()
{
    int    x = 0;
    int    y = 1;

    int& z = x;
    z = x;
    z = y;

    cout << "\nx: " << x;
    cout << "\ny: " << y;

    cout << "\nz: " << z;
    return 0;
}

**

РЕДАКТИРОВАТЬ:

** Этот код возвращает 1 для всех 3 случаев.Разве это не должно быть ошибкой?

8.5.3 Раздел стандарта C ++ гласит:

Ссылка не может быть изменена для ссылки на другой объект после инициализации.Обратите внимание, что инициализация ссылки 2 обрабатывается совершенно иначе, чем присвоение ей.Передача аргумента (5.2.2) и возврат значения функции (6.6.3) являются инициализацией.

Ответы [ 4 ]

6 голосов
/ 21 декабря 2011

Нет, в своем коде вы не меняете то, на что ссылается z, вместо этого вы меняете содержимое z (и, в свою очередь, то, на что оно ссылается, x).

Выэто можно увидеть с помощью следующего кода:

x = 5;
cout << x;
cout << z;

И x, и z будут иметь значение 5, поскольку z остается ссылкой на x.

1 голос
/ 21 декабря 2011
    {   int    x = 0;        // Let x be located at memory 0x1234
        int    y = 1;        // Let y be located at memory 0x5678

        int& z = x;          //There is a variable call z that is a reference to x.  
//That is z refers to the same memory location and thus the same content.

        z = x;               //Set the contents of z to the content of x. 
//Since z is currently a reference to x this essentially does nothing.
        z = y;               //Set the contents of z to the content of y which is the 
//same as set the contents of memory 0x1234 to the contents of memory 0x5678. 

        cout << "\nx: " << x; //print the contents of memory 0x1234
        cout << "\ny: " << y; //print the contents of memory 0x5678

        cout << "\nz: " << z; //print the contents of memory 0x1234
        return 0;
    }

Это не выдает ошибку, поскольку вы не меняете указатели памяти, а вместо этого их содержимое

1 голос
/ 21 декабря 2011
z = x
z = y

не меняет ссылку, но значение x.

0 голосов
/ 21 декабря 2011

Нет, это не приведет к ошибке. Как уже упоминалось, присвоение значений z аналогично присвоению значений тому, к чему оно относится, что в данном случае равно x.

В этом случае стандарт предписывает, чтобы z имел ссылку на x. Невозможно сделать z, чтобы ссылаться на какую-то другую переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...