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

Почему "самая важная константа" должна быть const?

В http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ в нем упоминается "самая важная константа", где С++ преднамеренно указывает, что привязка временного объекта к ссылке на const в стеке увеличивает срок службы временное время жизни самой ссылки. Мне было интересно, почему С++ позволяет продлить время жизни объекта, когда ссылка const, а не когда это не так? Какова рациональность этой функции и почему она должна быть const?

4b9b3361

Ответ 1

Вот пример:

void square(int &x)
{
  x = x * x;
}

int main()
{
  float f = 3.0f;

  square(f);

  std::cout << f << '\n';
}

Если временные записи могли связываться с неконстантными ссылками lvalue, то выше было бы с удовольствием скомпилировать, но произвести довольно неожиданные результаты (вывод 3 вместо 9).

Ответ 2

Рассмотрим следующее:

int& x = 5;
x = 6;

Что произойдет, если это будет разрешено? В отличие от этого, если вы сделали

const int& x = 5;

не было законного способа изменения x.

Ответ 3

Обратите внимание, что ссылки const могут быть привязаны к объектам, у которых даже нет адреса в обычном режиме. Функциональный параметр const int & может принимать аргумент, сформированный литеральным константным выражением 42. Мы не можем взять адрес 42, поэтому мы не можем передать его функции, которая принимает const int *.

const ссылки специально "благословлены", чтобы иметь возможность связываться с такими значениями, как это.

Конечно, для традиционных значений r, таких как 2 + 2, время жизни не является проблемой. Это проблема для rvalues ​​типа класса.

Если привязка ссылки допускается к некоторому объекту, который, в отличие от 42, не имеет повселокального срока службы, это время жизни должно быть расширено, так что ссылка остается разумной во всей области видимости.

Это не то, что const вызывает продление на всю жизнь, так что неконстантная ссылка не разрешена. Если бы это было разрешено, для этого потребовалось бы продление на всю жизнь; нет смысла указывать какую-либо ссылку, которая затем плохо работает в некоторых ее областях. Это поведение подрывает концепцию, что ссылка более безопасна, чем указатель.