D 追加到可为空类型的数组

D 追加到可为空类型的数组,d,D,如果我试图将一个可为null的结构附加到数组中,我必须强制转换它,但在使用索引将其分配给数组时不能。这是一个bug还是应该这样工作 import std.typecons; struct Foo { string s; int i; } void main() { f1(); f2(); f3(); } void f1() { auto foos = new Nullable!Foo[](10); foos[0] = Foo("abc

如果我试图将一个可为null的结构附加到数组中,我必须强制转换它,但在使用索引将其分配给数组时不能。这是一个bug还是应该这样工作

import std.typecons;

struct Foo {
    string s;
    int i;
}

void main() {
    f1();
    f2();
    f3();
}

void f1() {
    auto foos = new Nullable!Foo[](10);
    foos[0] = Foo("abc", 10);  // OK
}

void f2() {
    Nullable!Foo[] foos;
    foos ~= Foo("abc", 10); // Error: cannot append type Foo to type Nullable!(Foo)[]
}    

void f3() {
    Nullable!Foo[] foos;
    foos ~= cast(Nullable!Foo)Foo("abc", 10);  // OK
}

这是故意的,尽管我认为不理想。D缺乏隐式构造(除非在一个非常模糊的情况下,如果你好奇的话,变量类函数除外),你需要的是可空函数的隐式构造-给定Foo,你想围绕它构建一个可空包装器,而D不允许你在没有某种显式动作的情况下这样做,控制器构造函数调用或类似于1*的函数调用(在某些用户定义的数组中,重载的concat运算符将为您进行构造,但您使用的是内置数组,因此它根本不会重载)

如果分配它,它将调用
Nullable!T.对已施工项目进行opAssign
;在替换内容的类型中实现的重载函数

但是连接意味着需要创建一个新元素,这符合这个构造规则

我说它不理想,因为我真希望D有这个功能。C++对隐式构造函数有不良体验,但这是因为所有C++构造函数默认是隐式的,除非显式使用了<代码>显式< /Cord>关键字。D避免了那个错误,但把孩子和洗澡水一起扔了出去:(

  • 您的强制转换实际上被编译器重写为构造函数调用:
当值不是相同类型的结构时,将值v强制转换为结构S相当于:

S(v)