Лишние запятые в массивах

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

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

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

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

d
person Arlen    schedule 14.04.2011    source источник
comment
Обратите внимание, что это больше не будет работать в D2.   -  person user1461607    schedule 07.01.2015


Ответы (4)


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

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

person user541686    schedule 14.04.2011
comment
Именно поэтому это законно, @vnm, шаблоны - это генерация кода. - person he_the_great; 14.04.2011
comment
Я думаю, что этот ответ почти не имеет значения, потому что IIRC все упомянутые здесь случаи (кроме строковых миксинов) расширяются как структуры данных, а не как текст: т. е. запятые имеют отношение только к синтаксическому анализатору, а не к коду расширения шаблона. - person BCS; 15.04.2011
comment
@BCS: честная точка зрения; Я думаю, что вместо этого я должен был привести примеры миксинов. (Однако для читателя кортеж по-прежнему выглядит как набор вещей, разделенных запятыми, поэтому я думаю, что это делает его более последовательным и читабельным, по крайней мере.) - person user541686; 15.04.2011

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

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

без необходимости опускать запятую в последнем значении.

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

person Lawrence Dol    schedule 14.04.2011

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

person BCS    schedule 15.04.2011

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

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

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

person Ellery Newcomer    schedule 20.04.2011