Дополнительный ноль, когда структура печатается с writeln - PullRequest
1 голос
/ 20 мая 2019

В приведенном ниже коде, что это за дополнительные null в выводе, когда экземпляр S2 печатается с writeln?

$ dmd -de -w so_004.d && ./so_004
S1("A", 1)
S2("A", 1, null)

Если я определю S2 в области действия пакета(т. е. вне функции main) null исчезает.

Скомпилировано с разумным недавним DMD:

$ dmd --version
DMD64 D Compiler v2.083.0
Copyright (C) 1999-2018 by The D Language Foundation, All Rights Reserved written by Walter Bright

Я заметил проблему, когда изучал opEquals, и я 'Я не планирую определять типы в подобласти в «реальном» коде.

import std.stdio;

void main() {
  {
    struct S1 { string id; ushort x; }
    auto a = S1("A", 1);
    assert(a == a);
    writeln(a);
  }

  {
    struct S2 {
      string id; ushort x;
      bool opEquals()(auto ref const string rhs) const {
        return id == rhs;
      }
    }

    auto a = S2("A", 1);
    assert(a == "A");
    writeln(a);
  }
}

1 Ответ

1 голос
/ 20 мая 2019

Это указатель контекста (называемый this в S2.tupleof), относящийся к кадру стека, в котором создается экземпляр S2.Обычно это используется в коде, подобном следующему:

auto fun(int n) {
    struct S {
        int get() { return n; }
    }
    return S();
}

Приведенный выше код выделит n в куче и поместит указатель на него в this *1009* элементе.

Теперь, почему это в вашем коде - это ошибка .Указатель контекста не нужен, так как структура не использует переменные из своей области видимости.Чтобы удалить его, просто пометьте S2 как static:

static struct S2 {
    string id; ushort x;
    bool opEquals()(auto ref const string rhs) const {
        return id == rhs;
    }
}

auto a = S2("A", 1);
writeln(a); // S2("A", 1)
...