2015-10-20 3 views
3

Я знаю, что только объект может иметь ссылку. Но литералы не являются объектами. Так что я мог понять, почему следующий код не может скомпилировать:Почему использование ссылки const при ссылке на литералы

int &a = '4'; 
int &b = 2; 

Однако, когда я добавить сопзЬ перед ними, она могла бы работать !!

const int &a = '4'; 
const int &b = 2; 

Я не знаю почему. Может ли кто-нибудь мне помочь?

ответ

7

Целое число или символ буквальным является prvalue [expr.prim.general]

Литералом является первичным выражением. Его тип зависит от его формы (2.13). Строковый литерал - это значение lvalue; все другие литералы - это prvalues.

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

{ 
    const int & a = 42; 
    //line of code 
    //42 still exits here 
} // a goes out of scope and now 42 is gone 
0

(Assiming что вы вышли из «&» во втором фрагменте.)

Поскольку литерал не является объектом; создается временный объект, который имеет значение, соответствующее литералу.

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

+0

Что такое среднее время жизни _объекта_ здесь? почему мне нужно его продлить? – sydridgm