2011-04-14 76 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,至少,尾隨逗號應始終在數組文字以及參數列表,參數列表和參數列表中以及模板參數列表中有效。

但是,多個尾隨逗號是實現中的一個錯誤。