Почему не неконстантная ссылка на временные объекты? [Дубликат]

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 ++; не повлияет на меня ..

41 голос | спросил user738471 11 TueEurope/Moscow2012-12-11T23:13:07+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 23:13:07 +0400 2012, 23:13:07

4 ответа


0

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

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

int i = 0;
inc(i);

Почему i не изменилось?

ответил Bo Persson 11 TueEurope/Moscow2012-12-11T23:24:47+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 23:24:47 +0400 2012, 23:24:47
0
  

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

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

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

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

Обоснование для запрета привязки временных файлов к неконстантным ссылкам на самом деле не является фундаментальной проблемой при записи во временные ссылки. На самом деле во многих местах C ++ очень рад разрешить изменение временных значений:

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

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

Теперь со ссылками на rvalue вы можете делать то, что раньше было запрещено:

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

foo(2);

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

ответил bames53 11 TueEurope/Moscow2012-12-11T23:39:25+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 23:39:25 +0400 2012, 23:39:25
0

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

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

ответил Mark B 11 TueEurope/Moscow2012-12-11T23:23:21+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 23:23:21 +0400 2012, 23:23:21
0

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

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 и после него. Он уничтожается только после завершения всей строки.

ответил Israel Unterman 11 TueEurope/Moscow2012-12-11T23:27:12+04:00Europe/Moscow12bEurope/MoscowTue, 11 Dec 2012 23:27:12 +0400 2012, 23:27:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132