Дополнительные запятые в массивах - PullRequest
5 голосов
/ 14 апреля 2011
void main(){    
  int[3] arr = [1, 2, 3,];    
}

Допустима ли дополнительная запятая или она не помечена как ошибка из-за ошибки компилятора? У меня есть много миксинов, которые генерируют массивы с дополнительной запятой в конце. Я хотел бы знать, если бы я взял время, чтобы удалить их.

даже это компилируется без ошибок:

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

Ответы [ 5 ]

7 голосов
/ 14 апреля 2011

Я считаю, что это законно, чтобы разрешить шаблонам (или даже миксинам) работать в общем виде:

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

4 голосов
/ 14 апреля 2011

На многих языках разрешено форматирование кода, например:

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

без пропуска запятой из последнего значения.

Java также разрешает такой инициализатор массива.

3 голосов
/ 14 апреля 2011

Пожалуйста, проверьте этот пост

.NET теперь поддерживает запятую в массиве, как это делает python

Многие компиляторы допускают запятые в массиве.

1 голос
/ 20 апреля 2011

Несколько месяцев назад Уолтер передал это поведение в dmd.Раньше конечная запятая иногда была разрешена, а иногда нет, и если вы находитесь на земле dmd1, вы застряли с этим.

Теперь для dmd2, по крайней мере, конечная запятая всегда должна быть действительной влитерал массива, а также в списках параметров, списках аргументов и списках аргументов шаблона.

Однако множественные конечные запятые являются ошибкой в ​​реализации.

1 голос
/ 15 апреля 2011

Я на 99% уверен, что единственная запятая - это дизайн.2-й, 3-й и т. Д.?ИМХО, это ошибка в дизайне или реализации, но я не знаю, какая именно.

...