Почему opAssign не перегружается для классов?
Эта таблица говорит, что перегрузка присваивания возможна только для структур, но не для классов. Это удивляет меня. Не является ли синтаксический сахар A = B
безвредны? Каково было обоснование дизайна для ограничения его структурами?
3 ответа
В D классы используются по ссылке. Поэтому, когда вы делаете A = B, вы копируете не сам объект, а просто ссылку на этот объект.
Ни один из объектов не изменяется во время процесса. Поэтому нет смысла определять opAssign для этих целей.
D классы имеют ссылочную семантику. Если вам нужен способ получить копию объекта (он думает), стандартная или обычная вещь - это предоставить .dup
имущество.
Я бы подал ошибку, и сделал. Общее правило - язык программирования D, реализация DMD, веб-сайт. Так как у меня нет TDPL под рукой, я собираюсь реализовать это.
class A {
int a;
string b;
float c;
void opAssign(B b) {
a = b.a;
}
}
class B {
int a;
}
void main()
{
auto a = new A();
a.a = 5;
auto b = new B();
b.a = 10;
a = b;
assert(a.a == 10);
}