В чем разница между приведением значения и приведением задания?
Приведения значений преобразуют объект в значение:
char i = 'a';
int k = static_cast<int>(i); // Prefer C++ casts to C casts
Приведение ссылок преобразует объект в ссылку:
char i = 'a';
int &k = static_cast<int&>(i);
То, что преобразование может быть сделано неявным образом в int &k = i
, не означает, что оно не происходит.
Почему один из них вызывает преобразование (или создание нового объекта), а другой нет?
Если вы напишите int &x = static_cast<int&>(i)
, может произойти 2 вещи:
1) Создается указатель, указывающий на i
(ссылки являются скрытыми указателями). Затем этот скрытый указатель присваивается x
, а x
ведет себя как ссылка на i
.
2) Обычно компилятор оптимизирует эту ссылку и просто рассматривает x как псевдоним из i. Поэтому ни одна переменная не создается.
В первом случае создается новый объект.
Однако, если вы напишите:
char c = 'a';
int i = static_cast<int> (c);
инстанцирования нет, просто копия памяти от c
до i
.
Почему эти люди не будут кастоваться на базу?
*this = (Base&) rhs
Нельзя назначить базовый объект производному производному объекту , только наоборот. Скорее всего, это заменит поля базового объекта на производного объекта .
(Base)* this = rhs
Нет смысла рокировать l-значение . Это эквивалентно:
*this = rhs;
Каковы предостережения от использования кастинга на rhs?
Не думаю, что с приведением типов что-то не так, если только они не снижают читаемость.