void main(){
int[3] arr = [1, 2, 3,];
}
额外的逗号是合法的还是因为编译器错误而没有被标记为错误?我有很多mixins生成带有额外逗号的数组。我想知道我是否应该花时间删除它们。
即使这样编译也没有错误:
void main(){
int[3] arr = [1, 2, 3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,];
}
答案 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)
答案 3 :(得分:1)
我99%肯定单个逗号是设计的。第2,第3等?恕我直言,这是设计或实现中的一个错误,但我不知道哪个。
答案 4 :(得分:1)
几个月前,Walter将这种行为归咎于dmd。以前,有时允许使用尾随逗号,有时不允许,如果你在dmd1的土地上,那么你就会被困在那里。
现在,对于dmd2,至少,尾随逗号应始终在数组文字中以及参数列表,参数列表和模板参数列表中有效。
然而,多个尾随逗号是实现中的错误。