void main(){
int[3] arr = [1, 2, 3,];
}
额外的逗号是合法还是因为编译器错误而未被标记为错误?我有很多mixin在最后用逗号生成数组。我想知道我是否应该花时间将其删除。数组中的额外逗号
即使这样编译没有错误:
void main(){
int[3] arr = [1, 2, 3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,];
}
void main(){
int[3] arr = [1, 2, 3,];
}
额外的逗号是合法还是因为编译器错误而未被标记为错误?我有很多mixin在最后用逗号生成数组。我想知道我是否应该花时间将其删除。数组中的额外逗号
即使这样编译没有错误:
void main(){
int[3] arr = [1, 2, 3,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,];
}
我相信这是法律,以允许模板(甚至混入)在一个通用的方式工作:
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, ]
。
它让许多语言允许代码格式,如:不必从最后一个值省略了逗号
string[3] arr = [
"Some long String",
"And another",
"etc, etc, etc",
];
。
Java也允许这样的数组初始化器。
C++只允许一个尾随逗号;任何不止一个都是错误。我来自C++,以及D编译器的当前状态,我不知道该怎么想。 – Arlen 2011-04-14 05:50:04
我99%肯定这个单一的逗号是由设计。第二,第三等?恕我直言,这是设计或实施中的错误,但我不知道是哪一个。
几个月前沃尔特将这种行为落实到了dmd中。以前,逗号有时候是允许的,有时候不允许,如果你在dmd1的土地上,你就会陷入困境。
现在,对于dmd2,至少,尾随逗号应始终在数组文字以及参数列表,参数列表和参数列表中以及模板参数列表中有效。
但是,多个尾随逗号是实现中的一个错误。
请注意,这将不再适用于D2。 – user1461607 2015-01-07 14:39:55