使用writeln打印结构时,额外的null

时间:2019-05-20 04:09:50

标签: d

在下面的代码中,用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 个答案:

答案 0 :(得分:1)

它是上下文指针(在this中称为S2.tupleof),是指在其上创建S2实例的堆栈帧。通常在这样的代码中使用它:

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

上面的代码将在堆上分配n,并将指向它的指针放在S的{​​{1}}成员中。

现在,为什么要在您的代码中使用它-that's a bug。不需要上下文指针,因为该结构未使用其作用域中的任何变量。要删除它,只需将this标记为S2

static