#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 ]
Комментариев нет:
Отправить комментарий