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