Подтвердить что ты не робот

Почему не постоянная ссылка на временные объекты?

  Возможный дубликат:
Продлевает ли константная ссылка временную жизнь?
продлевая время жизни временных людей

C++ позволяет присваивать временные объекты только константной ссылке. Он не позволяет присваивать временные объекты для ссылки.

Например:

String& a = String("test");         // Error
const String& a = String("test");   // Ok

Везде, где я гуглюсь по этому результату, я вижу только следующие ответы

  1. Изменение временных объектов может вызвать проблемы, которые невозможно идентифицировать
  2. Модификация временных объектов опасна
  3. В какой-то момент вы забудете, что это временная переменная

Как было сказано, временные объекты исчезают после утверждения. Таким образом, вы не должны изменять его.

Если C++ так заинтересован в блокировании модификации временных объектов, он должен был заблокировать чтение временных объектов, верно? Если временный объект исчез, то нет смысла читать содержимое оттуда, верно? Возможные случаи, когда может возникнуть право, также могут включать чтение.

Тогда почему ее блокируют запись в одиночку и позволяют читать?

Пожалуйста, дайте мне твердое объяснение кода C++.

Пожалуйста, не отклоняйтесь от вопроса, указав некоторые альтернативы. Пожалуйста, дайте мне точный ответ с кодом, почему const int & разрешено и int & не допускается для временных объектов.

Один говорит && есть.. мой вопрос другой.. Иными словами, изменение не будет отражать.. Изменение не будет отражаться, даже если это const int & слишком. Например: двойной а; Const int & я = а; a++; не повлияет на меня..

4b9b3361

Ответ 1

Исходным случаем для недопущения ссылок на временные параметры были для параметров функции. Предположим, что это разрешено:

void inc(double& x)
{ x += 0.1; }

int i = 0;
inc(i);

Почему не изменяется i?

Ответ 2

Если С++, так сильно блокирует изменение временных объектов, он должен заблокировать чтение временных объектов? Если временный объект исчез, то нет смысла читать содержимое справа?

Нет, чтение объекта совершенно разумно. Просто потому, что он исчезнет в будущем, не означает, что чтение данных теперь бессмысленно.

open_file(std::string("foo.txt"));

std::string("foo.txt") является временным, который прекратит существование после вызова open_file(), но данные, которые он содержит, когда он действительно существует, очень важны.

Рациональное для того, чтобы временные ссылки не привязывались к неконстантным ссылкам, на самом деле не является фундаментальной проблемой при записи во временные. Фактически во многих местах С++ с удовольствием разрешает временные изменения:

std::string("foo") = "bar";

Просто дизайнеры почувствовали, что это вызовет достаточное количество проблем (вероятно, из-за общей идиомы "параметров" ), не включив ничего подобного, поэтому они просто сделали дизайнерское решение, чтобы запретить временные привязки к не-const ссылки.

С помощью ссылок rvalue теперь вы можете сделать то, что было ранее:

void foo(int &&output) {
    output = 1;
}

foo(2);

Это отлично работает, это просто не очень полезно.

Ответ 3

Если у вас есть временный объект, который очень дорог для копирования, вы можете предпочесть взять const& для этого объекта (скажем, функцию return), а не копировать его в другую переменную, которая будет использоваться позже. Постоянная ссылка на временное продление срока действия этого временного до тех пор, пока эта ссылка живет, что позволяет вам получить доступ к любому читаемому состоянию.

Запись запрещена, поскольку, как только вы хотите изменить переменную, вы также можете иметь реальный экземпляр, а не временный, который будет псевдонимом только как неконстантная ссылка.

Ответ 4

Для этого есть логическая причина. Подумайте, что вы действительно хотите в этой строке:

String& a = String("test");         // Error

Вам нужна ссылка. Ссылка ссылается на объект, на который он ссылается. Как адрес объекта (хотя ссылки не являются адресами, это делает объяснение более ясным таким образом). Вы действительно пытаетесь получить что-то вроде адреса String("test"). Но этот объект будет исчезать прямо на следующей строке, так что точка его адреса, если объект, на который он указывает, не существует? a теперь указывает на нечто бессмысленное...

Что касается вашего второго вопроса, то какой смысл допускать временные объекты всецело, ну, в этом нет ничего плохого. Рассмотрим, например, случай, когда вы хотите передать объект String функции, которая возвращает, скажем, модифицированную строку, соответствующую этой строке. Позвольте вызвать функцию DoubleString, поэтому вместо выполнения

String s("hello ");
String s2 = DoubleString(s);

Вы можете использовать более короткую и удобную форму

String s2 = DoubleString(String("hello "));

См., временный объект String("hello ") сохраняет всю строку кода, что означает, что он не поврежден при отправке на DoubleString и после него. Он уничтожается только после завершения всей строки.