原文
考虑该几乎最小的示例:
import std.algorithm;
import std.range;
import std.stdio;
struct S(Nested){
Nested member; //`=I.init;`//取消注解无用
int g;
this(Nested member){
this.member = member;
}
this(int g){
this.g = g;
version(fix)
member = Nested.init;
}
}
//`IFTI`处理映射类型
auto makeS(Nested)(Nested member) => S!(Nested)(member);
import std.sumtype;
//这只是工作,不需要修复
auto makeSum(I)(I i) => SumType!(string, I)(i);
void main(){
auto input = iota(5).map!(b => b + 1).map!(b => b - 1);
auto s = makeS(input);
auto s2 = makeSum(input);
writeln(s);
writeln(s2);
}
用rdmd -version=fix app.d运行代码可工作,但运行rdmd -version=fix app.d会产生:
错误:必须在构造器中初化字段成员,因为它是嵌套构.
为什么?
我在规范中没有找到相关内容.
对不起,显然应该是:
使用rdmd -version=fix app.d运行代码可工作,但仅运行rdmd app.d会产生:
错误:必须在构造器中初化字段成员,因为它是嵌套构.
嵌套构包含,在运行时需要初化的环境指针.如果不初化它们,则用null设置指针,则结构就无法访问其环境.
使用.init并不能解决该问题,因为是在编译时确定的.init,并也让null替换环境指针.
我明白了,谢谢你的解释.
就我而言,不初化对象是有意义的,所以这不是问题.void初化可能更好表明意图,但编译器不允许.