在下面的代码中,用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);
}
}
答案 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