D 追加到可为空类型的数组
如果我试图将一个可为null的结构附加到数组中,我必须强制转换它,但在使用索引将其分配给数组时不能。这是一个bug还是应该这样工作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
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避免了那个错误,但把孩子和洗澡水一起扔了出去:(
- 您的强制转换实际上被编译器重写为构造函数调用: