初始化表达式是D中构造函数的一部分吗?

Jai*_*ero 3 d class initializer dmd

在D中,我可以直接在声明上初始化并期望初始化表达式是构造函数的一部分吗?我来自C#,就是这样.但随着DMD 2.071.0我得到其他行为.

class Other { }

class Test { Other nonStaticMember = new Other; }

void test()
{
    auto t1 = new Test;
    auto t2 = new Test;
    // Assert is failing, the two Test instances are 
    // being initialized to the same reference
    // instead of execute the Other constructor twice.
    assert(t1.nonStaticMember !is t2.nonStaticMember);
}
Run Code Online (Sandbox Code Playgroud)

如果这是意图行为,应在此处记录:https://dlang.org/spec/class.html 对吗?

Vla*_*eev 5

这段代码在D中没有用C#做什么.

在您的示例中,在编译期间Other进行实例化.

Other,在编译期间实例化一次,并将其放置在程序的数据段中.然后,nonStaticMember默认情况下,初始值将指向Other所有Test实例的该实例.

因此,即使从其他语言来源可能会令人惊讶,一切都按照设计完成.

如果这是意图行为,应在此处记录:https://dlang.org/spec/class.html对吗?

也许,但请注意,这种行为根本不是特定于类的.指向堆上分配的任何值的指针,作为全局或局部静态变量的初始值,将表现相同.只要在编译期间需要表达式的值(并且包括全局/静态变量的初始值设定项),D就会尝试在编译时对其进行求值.几年前,这已经扩展到在"堆"上分配值,然后最终在程序的初始数据段中.