Страницы

Поиск по вопросам

понедельник, 9 декабря 2019 г.

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

#cpp #language_lawyer


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


Ответы

Ответ 1



Вступление: вопросы из разряда «почему так сделали в Стандарте» обычно закрывают на enSO, так как ответить могут только члены из комитета по стандартизации, которые принимали это правило, а они, как правило, не присутствуют на SO, чтобы дать ответ. Но данному вопросу повезло, его закрыли по другой причине (дубликат) и после публикации ответов, один из которых я и заимствую. Если бы привязка временного объекта была возможна к неконстантной ссылки, могли бы возникать довольно странные ситуации. Например: void inc(double& x) { x += 0.1; } int i = 0; inc(i); Исходно переменная имеет тип int, но приходит в функцию как ссылка на double. Здесь создаётся временный объект, модификация которого внутри функции, реально ни к чему не приводит. Более того, она нелепа, так как осуществляется попытка увеличить целое на 0.1, что, понятно дело, не является возможным.

Ответ 2



Это касается lvalue-reference. rvalue-reference может быть не const. Вырезка из стандарта C++ (N3691): A reference to type “cv1 T1” is initialized by an expression of type “cv2 T2” as follows: ... — Otherwise, the reference shall be an lvalue reference to a non-volatile const type (i.e., cv1 shall be const), or the reference shall be an rvalue reference. [Example: double& rd2 = 2.0;//error: not an lvalue and reference not const int i = 2; double& rd3 = i;//error: type mismatch and reference not const — end example ]

Комментариев нет:

Отправить комментарий