如果我尝试将Nullable结构附加到数组中,我必须将其强制转换,但不是在使用索引将其分配给数组时。这是一个错误还是它应该以这种方式工作?
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
}
答案 0 :(得分:3)
这是故意的,虽然我说不理想。 D缺少隐式构造(除非在一个非常模糊的情况下,如果你很好奇,可变参数类函数)以及你要求的是Nullable的隐式构造 - 给定Foo,你想在它周围构建一个Nullable包装器,如果没有某种显式操作,D不会让你这样做,无论是导向器构造函数调用还是函数调用,就像一个*(在一些用户定义的数组中,重载的concat运算符会为你构造,但是你正在使用内置数组,所以它根本没有重载。
如果你指定它,它会在已经构建的项目上调用Nullable!T.opAssign
;在http://dpldocs.info/experimental-docs/std.typecons.Nullable.opAssign.html类型中实现的重载函数,用于替换内容。
但是连接意味着需要制作一个新的元素,这符合这个构造规则。
我说这不太理想,因为我希望D有这个功能。 C ++在使用隐式构造函数方面遇到了不好的经历,但这是因为默认情况下所有C ++构造函数都是隐式的,除非您明确使用了explicit
关键字。 D避免了这个错误,但把婴儿扔出洗澡水:(
当值不是相同类型的结构时,将值v转换为结构S,等同于:
S(v)的