嵌套构的字段"/>
2310D必须在构造器中初化嵌套构的字段
原文
考虑该几乎最小
的示例:
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
初化可能更好
表明意图,但编译器不允许.
更多推荐
2310D必须在构造器中初化嵌套构的字段
发布评论