Почему 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);
}
Другие вопросы по тегам