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初化可能更好表明意图,但编译器不允许.

你可能感兴趣的:(dlang,d,d)