Трейлинг-запятые и С++

Я где-то читал, что стандарт С++ не позволяет что-то вроде enum an_enum { a, b, c, };, а более поздние версии C (я думаю, из середины 90-х годов) допускают такие объявления с запятыми. Если предполагается, что С++ имеет обратную совместимость с C, почему эта функция запрещена? Любая особая причина?

Я также читал, что такие конечные запятые на самом деле хороши, поэтому просто добавляет путаницу.

Ответ 1

С++ 03 (это довольно небольшое обновление С++ 98) основывает его совместимость с C на C89 (также известный как C90, в зависимости от того, являетесь ли вы ANSI или ISO). C89 не разрешает запятую. C99 действительно позволяет. С++ 11 позволяет это (7.2/1 имеет грамматику для объявления перечисления).

На самом деле С++ не совсем обратно совместим даже с C89, хотя это тот факт, что если бы он был на C89, вы ожидали бы, что С++ разрешит его.

Ключевым преимуществом для меня в конце запятой является, когда вы пишете это:

enum Channel {
    RED,
    GREEN,
    BLUE,
};

а затем измените его на следующее:

enum Channel {
    RED,
    GREEN,
    BLUE,
    ALPHA,
};

Хорошо, что только одна строка изменяется, когда вы diff версии. Чтобы получить тот же эффект, когда нет конечной запятой, вы можете написать:

enum Channel {
    RED
   ,GREEN
   ,BLUE
};

Но (а) этот сумасшедший разговор и (б) он не помогает в (по общему признанию, редком) случае, когда вы хотите добавить новое значение в начале.

Ответ 2

Глядя на последний черновик для С++ 0x, вы можете использовать запятые:

enum-specifier:
enum-head { enumerator-list opt}
enum-head { enumerator-list , }

enumerator-list:
enumerator-definition
enumerator-list , enumerator-definition

Ответ 3

С одной стороны, последний стандарт C был в 1999 году. Последний (полный) стандарт С++ был 98 (в 2003 году было обновление). После этого не все C99 входят в С++ 11.

Ответ 4

Трейлинг-запятая в enum была введена в C99 как функция. Он не существует в версиях C90 и С++, которые были основаны на базовой линии до C99.