数组中的额外逗号

时间:2011-04-14 04:54:13

标签: d

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

额外的逗号是合法的还是因为编译器错误而没有被标记为错误?我有很多mixins生成带有额外逗号的数组。我想知道我是否应该花时间删除它们。

即使这样编译也没有错误:

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

5 个答案:

答案 0 :(得分:7)

我认为允许模板(甚至是mixins)以通用方式工作是合法的:

template Foo(T) { }                       //What if Foo is empty like this?

auto arr = [1, 2, Foo!(int), Foo!(long)];
//         [1, 2, , ]

它使模板更多更容易使用,因此您不必特殊情况下针对特殊输出。

一个更现实的例子:

template Iota(size_t start, size_t end)  //All integers in range [start, end)
{
    static if (start < end)
        alias TypeTuple!(start, Iota!(start + 1, end)) Iota;
    else
        alias TypeTuple!() Iota;
}

auto arr1 = [-10, Iota!(0, 3)];    // arr is now [-10, 0, 1, 2]
auto arr2 = [-10, Iota!(a, b)];    // arr is now [-10, a .. b]

现在如果a等于b会怎样?然后arr2衰减到[-10, ]

答案 1 :(得分:4)

许多语言都允许允许代码格式化:

string[3] arr = [
    "Some long String",
    "And another",
    "etc, etc, etc",
    ];

,而不必省略最后一个值的逗号。

Java也允许这样的数组初始化器。

答案 2 :(得分:3)

请查看这篇文章

.NET now support trailing comma in array like python does

许多编译器允许在数组中使用尾随逗号。

答案 3 :(得分:1)

我99%肯定单个逗号是设计的。第2,第3等?恕我直言,这是设计或实现中的一个错误,但我不知道哪个。

答案 4 :(得分:1)

几个月前,Walter将这种行为归咎于dmd。以前,有时允许使用尾随逗号,有时不允许,如果你在dmd1的土地上,那么你就会被困在那里。

现在,对于dmd2,至少,尾随逗号应始终在数组文字中以及参数列表,参数列表和模板参数列表中有效。

然而,多个尾随逗号是实现中的错误。