Инициализация непостоянной ссылки из постоянной ссылки - PullRequest
4 голосов
/ 07 июня 2011
int main(){   
  int x = 10;
  const int&z = x;
  int &y = z; // why is this ill formed?
}

Почему инициализация непостоянной ссылки на int постоянной ссылкой не является правильной?В чем причина этого?

Ответы [ 6 ]

9 голосов
/ 07 июня 2011

Ну, почему бы не быть плохо сформированным?

Он плохо сформирован, потому что нарушает очевидные правила правильности констант. В языке C ++ вам не разрешено неявно преобразовывать проход с постоянным доступом в неконстантный путь доступа. То же самое для указателей и для ссылок. В этом и заключается цель постоянных путей доступа: предотвращать изменение объекта, к которому ведет путь. После того, как вы сделали его постоянным, вам не разрешено возвращаться к непостоянному, если вы не приложите конкретные явные и сознательные усилия, чтобы сделать это с помощью const_cast.

В этом конкретном случае вы можете легко удалить константность из пути доступа, используя const_cast (для этого const_cast), и юридически изменить ссылочный объект, так как ссылочный объект не является на самом деле постоянным

int main(){   
  int x = 10;
  const int &z = x;
  int &y = const_cast<int &>(z);
  y = 42; // modifies x
}
1 голос
/ 07 июня 2011

Компилятор предполагает, что вещь, на которую ссылается const int &, является const int, хотя в этом случае это не так. Вы не можете сделать неконстантную ссылку ссылающейся на const int, потому что тогда вы сможете изменить (условно) const int через ссылку.

1 голос
/ 07 июня 2011

Поскольку константная ссылка не может быть изменена, тогда как стандартная ссылка является.

1 голос
/ 07 июня 2011

Поскольку y не const, вы могли бы написать y = 42 и изменить z (то есть const).

0 голосов
/ 07 июня 2011

Как говорят другие, это позволило бы косвенно изменить x, что нарушает обещание правильности. Смотри http://en.wikipedia.org/wiki/Const_correctness

0 голосов
/ 07 июня 2011

Потому что

int const x = 10;
int const& z = x;
int& y = z;

y = 42;

изменит постоянную переменную.

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