D中的结构参数推导

scr*_*cry 3 templates type-inference d

只是想知道为什么这不编译.我以为编译器可以推断参数化结构的类型?

void main() {
    auto arr = Arr([1,2,3]);
}

struct Arr(T) {
    private T[] data;
}
Run Code Online (Sandbox Code Playgroud)

错误:

junk.d(25): Error: struct junk.Arr(T) is not a function template
junk.d(25): Error: struct junk.Arr(T) cannot deduce template function from argument types !()(int[])
Run Code Online (Sandbox Code Playgroud)

jA_*_*cOp 8

表格代码:

auto arr = Arr([1,2,3]);
Run Code Online (Sandbox Code Playgroud)

是一个调用构造函数的Arr时候Arr是一个struct.在这种情况下,没有明确的构造函数.如果存在,它可能已经模板化,参数推断确实适用于模板化构造函数.由于没有构造函数,因此参数将用于按Arr声明的顺序初始化字段.但是,当然Arr是一个模板,所以构造的类型尚不清楚.

如果您认为此案例应该有参数推断,请考虑以下事项:

struct Arr(T)
{
    static if(is(T == bool))
        BitArray data;
    else
        T[] data;
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,在模板被实例化之前,不知道字段的类型(也可能是它的顺序)...那么它将如何推断?

必须显式实例化模板:

auto arr = Arr!int([1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)