D 如何调用struct';所有参数都具有默认值的自定义构造函数?

D 如何调用struct';所有参数都具有默认值的自定义构造函数?,d,D,假设我有以下结构: import std.stdio; struct A { this (int arg = 1) { writeln("Correct constructor"); } this(); } 如何使用构造函数的默认值 …生成错误:构造函数app.A。这是不可调用的,因为它带有@disable注释。如果我从默认构造函数中删除@disable属性,我将不会执行自己的构造函数 还有,为什么不允许结构具有自定义默认构造函数?我不知道结构的作

假设我有以下结构:

import std.stdio;
struct A
{
    this (int arg = 1) {
        writeln("Correct constructor");
    }

    this(); 
}
如何使用构造函数的默认值

…生成
错误:构造函数app.A。这是不可调用的,因为它带有@disable
注释。如果我从默认构造函数中删除
@disable
属性,我将不会执行自己的构造函数


还有,为什么不允许结构具有自定义默认构造函数?

我不知道结构的作用是什么,但您可以作弊并尝试重载静态opCall:

import std.stdio;
struct A {
    static auto opCall() {
        writeln("Correct constructor");
        auto a = typeof(this).init;
        return a;
    };
};

void main() {
    A a = A();
};

您不应该实现默认的结构构造函数(原因如下:)

删除
this()代码中的行。你不需要它

如果您希望某些特定值成为默认值,只需在模块级别设置,并在整个应用程序中使用它。如以下示例所示:

import std.stdio;

struct A {
  int a;
  int b;

  this (int arg = 1) {
     a = arg;
     // writeln("Correct constructor");
  }

}

immutable(A) defA = A(5);

void main() {
  A a1 = A(2);
  writeln(a1); // output: A(2, 0)

  // Or, init all to defaults
  A a2 = A.init;
  writeln(a2); // output: A(0, 0)
  A a3 = A();  // same as A.init, as you can see
  writeln(a3); // output: A(0, 0)

  A a4 = defA; // Let's use our "default" value
  a4.b = 10;
  writeln(a4); // output: A(5, 10)
}

不。它只在第二次调用时调用“Correct construcor”(a2=A(2)
)。第一个调用默认构造函数,该构造函数用零初始化所有内容,并且从不执行自定义代码。第一个是结构初始化器。我没有说它将使用默认参数执行构造函数。第二个是。我将编辑我的帖子以避免这种误解。这似乎是有效的。有多少欺骗行为?我应该期待任何副作用吗?例如,我注意到,当我用
A A=A.init
替换main中的行时,静态opCall不会被调用,但这与我无关。@AdamRyczkowski:我主要关心的是
A.\u ctor
不存在于这种方法中,这可能会干扰一些内省技术。老实说,我对
静态opCall
没有太多经验,但我怀疑它在大多数用例中都能正常工作。另外,正如您所指出的,
.init
永远不会调用函数,因为它会编译成一个简单的
mov
rep movs
(x86)来编写默认字段值。
import std.stdio;

struct A {
  int a;
  int b;

  this (int arg = 1) {
     a = arg;
     // writeln("Correct constructor");
  }

}

immutable(A) defA = A(5);

void main() {
  A a1 = A(2);
  writeln(a1); // output: A(2, 0)

  // Or, init all to defaults
  A a2 = A.init;
  writeln(a2); // output: A(0, 0)
  A a3 = A();  // same as A.init, as you can see
  writeln(a3); // output: A(0, 0)

  A a4 = defA; // Let's use our "default" value
  a4.b = 10;
  writeln(a4); // output: A(5, 10)
}