Показать сообщение отдельно

  #9  
Старый 31.03.2023, 21:12
san0
Постоянный
Регистрация: 15.12.2013
Сообщений: 412
С нами: 6530249

Репутация: 133
По умолчанию

Цитата:
Сообщение от kin4stat  

Ты путаешь категорию значения с типом ссылки. Разыменование дает lvalue reference, lvalue reference сам по себе является lvalue
C++:





Код:
int
&
addr
=
*
(
int
*
)
0xBAB230
;


Ссылка - это левая часть, ее тип - lvalue reference to int.

Справа - выражение, которое после вычисления *((T*)ptr) будет lvalue выражением, но типа T, а не lvalue reference T&

Даже явный каст к T& ничего не дает, он все равно неявно преобразуется к T и инициализирует ссылку, как и сказано в стандарте

C++:





Код:
int
a
=
1
;
int
*
ptr
=
(
int
*
)
&
a
;
// даже не ссылку можно инициализировать при помощи lvalue выражения (static_cast к lvalue reference это lvalue) типа lvalue reference (int&)
int
val
=
static_cast

(
*
ptr
)
;
int
&
ref
=
static_cast

(
*
ptr
)
;


Где стандартом обозначено, что *(T*) == (T&) т.е. разыменование указателя равняется T& а не T?
 
Ответить с цитированием