Значение приведено против Ссылка приведена - PullRequest
0 голосов
/ 06 мая 2018

Какая разница между значением приведения и опорным значением ? Почему один из них вызывает преобразование (или создание нового объекта), а другой нет? Каковы предостережения от использования кастинга на rhs?

Предположим, это равно Производное . Почему те не будут на самом деле приводить к Base ?

*this = (Base&) rhs
(Base)* this = rhs

Не могли бы вы показать на простых примерах?

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Value cast создает новое значение из существующего; приведение ссылки создает новую ссылку на то же существующее значение.

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

Например, если у вас есть unsigned char, и вы хотите значение или ссылку типа int, приведение значения будет работать, а приведение ссылки не удастся:

unsigned char orig = 'x';
int  v(orig); // Works
int &r(orig); // Does not work

rhs - это Derived, я хочу присвоить все унаследованные и не наследуемые вещи из rhs в Base

Затем вам нужно привести обе стороны к Base или добавить оператор присваивания к Derived, который принимает const Base& в качестве аргумента. Вот пример приведения с обеих сторон (другие программисты, читающие ваш код, могут быть трудно понять)

struct Base {
    int x;
    Base(int x) : x(x) {}
};
struct Derived1 : public Base {
    Derived1(int x) : Base(x) {}
};
struct Derived2 : public Base {
    Derived2(int x) : Base(x) {}
};

Выполнение кода ниже

Derived1 d1(5);
Derived2 d2(10);
cout << d1.x << " " << d2.x << endl;
((Base&)d1) = (Base&)d2;
cout << d1.x << " " << d2.x << endl;

производит следующую распечатку:

5 10
10 10

Как видите, назначение ((Base&)d1) = (Base&)d2 скопировало содержимое части d2 Base в часть d1 Base ( demo ).

0 голосов
/ 06 мая 2018

В чем разница между приведением значения и приведением задания?

Приведения значений преобразуют объект в значение:

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?

Не думаю, что с приведением типов что-то не так, если только они не снижают читаемость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...