2011-04-14 47 views
5
void main(){  
    int[3] arr = [1, 2, 3,];  
} 

额外的逗号是合法还是因为编译器错误而未被标记为错误?我有很多mixin在最后用逗号生成数组。我想知道我是否应该花时间将其删除。数组中的额外逗号

即使这样编译没有错误:

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

请注意,这将不再适用于D2。 – user1461607 2015-01-07 14:39:55

回答

7

我相信这是法律,以允许模板(甚至混入)在一个通用的方式工作:

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, ]

+0

它也可以在代码生成方便 – cybevnm 2011-04-14 14:36:23

+0

这正是为什么它是合法的,@ vnm,模板是代码生成。 – 2011-04-14 17:59:14

+3

我认为这个答案几乎是不相关的,因为IIRC这里提到的所有情况(除了字符串混入)都被扩展为数据结构,而不是文本:即逗号仅与解析器相关,而不与模板扩展代码相关。 – BCS 2011-04-15 01:53:42

4

它让许多语言允许代码格式,如:不必从最后一个值省略了逗号

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

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

1

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

1

几个月前沃尔特将这种行为落实到了dmd中。以前,逗号有时候是允许的,有时候不允许,如果你在dmd1的土地上,你就会陷入困境。

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

但是,多个尾随逗号是实现中的一个错误。