Продление времени жизни временного значения в C ++ - PullRequest
3 голосов
/ 06 марта 2012
const int &ra=3;
  1. Как я знаю, создание ra const продлит время жизни временного значения r, которое в данном случае равно 3. Это немного сбивает с толку, насколько я знаю ra должен иметь тот же адрес, что и r-значение, которое здесь 3, но 3 не является реальной переменной и не имеет памяти, в которой она хранится.Итак, как это возможно?

  2. в чем разница между:

    const int& ra=a;
    

    и

    int& const ra=a;
    

Ответы [ 3 ]

12 голосов
/ 06 марта 2012

но 3 не является реальной переменной и не имеет памяти, в которой она хранится. так как это возможно?

На самом деле временный объект создается из литерала 3, а затем этот временный объект связывается со ссылкой const. Вот так это становится возможным.


Теперь ваш следующий вопрос: разница между этими двумя

const int& ra=a;
int& const ra=a;

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

8 голосов
/ 06 марта 2012

1) Независимо от того, решит ли компилятор на самом деле сохранить ваш номер 3, это деталь, которая зависит от решений по оптимизации. Что касается языка, временный объект живет столько же, сколько и ссылка. Практически, если вам нужно только значение (а не объект ), объект может вообще никогда не сохраняться, и вместо этого компилятор может подставлять значение напрямую всякий раз, когда вы используете ra , Конечно, если вы берете адрес (через &ra), то компилятор позаботится о том, чтобы объект действительно где-то хранился, чтобы вы могли взять его адрес. (Он может по-прежнему подставлять значение непосредственно в другом месте, а не загружать его с этого адреса.)

2) Вторая версия недействительна для C ++. Вы можете сказать только int const & x и const int & x, по той же причине, что int const и const int обозначают один и тот же тип. Сама ссылка не имеет понятия постоянства; он всегда привязан к объекту, с которым он инициализируется (т. е. у вас не может быть «голого» ссылочного объекта int & x;).

0 голосов
/ 06 марта 2012

Насколько я понимаю, когда вы создаете переменную const, ей выделяется память, в которой она хранится, как и любая другая переменная. В зависимости от компилятора, если вы поместите это const 3 в функцию, он может выделять temp 3 каждый раз, когда вы вызываете функцию, или он может просто ссылаться на статическое значение, назначенное при запуске программы. Эта 3 ​​- реальная переменная в том смысле, что это данные, которые хранятся где-то, как и любая другая переменная.

Однако обращение к этому значению за пределами его области будет безрассудной попыткой выяснить, будет ли оно работать, и поэтому вам не следует использовать это как способ «продлить жизнь» переменной. Возможно, вам повезет, и const будет размещен в статическом месте, и вы всегда получите желаемое значение, даже если вы получите к нему доступ вне области видимости; но вам может не повезти, и в конечном итоге вы получите данные, которые записаны с желаемым временным значением. Поведение «неопределено» - это означает, что компиляторы сами решают, как они хотят это сделать, поэтому вы не можете рассчитывать на это. Вместо этого увеличьте область действия переменной, объявив ее раньше или выделив ее в куче (int* x = malloc(sizeof(int))//, etc. и передав ее указатель.

...