Подтвердить что ты не робот

Почему ограничение на оператор запятой находилось в постоянном выражении, удаленном в С++ 11?

Недавно, когда отвечая на вопрос, я понял, что оператор запятой разрешен в постоянном выражении в С++ 11, если выражение окружено (), например:

int a[ (1, 2) ] ;

Pre С++ 11 запрещено использовать оператор запятой в постоянном выражении, из проекта pre С++ 11 standard раздел 5.19 Постоянные выражения, в которых говорится (акцент мой):

[...] В частности, кроме выражения sizeof, функций, класса объекты, указатели или ссылки не должны использоваться и присваивание, инкремент, декремент, функция-вызов или запятые не должны быть б.

Почему оператор запятой не разрешен в постоянном выражении pre С++ 11 и почему это ограничение было отменено?

4b9b3361

Ответ 1

Мы можем найти ответ на этот вопрос в std-discussion group Comma operator in constant-expression, где говорит Габриэль Дос Рейс:

Для С++ 11 я предложил разрешить это, потому что появилось ограничение произвольные и все причины, о которых я слышал, в качестве обоснования для его запрета очень неубедительным и показательным для меня.

и Ричард Смит ранее в потоке отмечает некоторые из применений оператора запятой в постоянном выражении как в С++ 11, так и в С++ 14:

Я не согласен с вашими аргументами и вашим заключением. В С++ 11 запятая оператор полезен в рамках функций constexpr, потому что мы не разрешено несколько операторов:

template<typename T>   constexpr T my_array<T>::at(size_type n) {
  return (n < size() || throw "n too large"), (*this)[n];   }

В С++ 14 он полезен практически во всех случаях, когда он полезно вне постоянных выражений:

constexpr void do_stuff(int x[]) {
  for (int i = 0, j = 100; i != j; ++i, --j)
    x[i] = x[j];   }

Более философски, мы не должны запрещать вещи от постоянного потому что мы недостаточно изобретательны, чтобы найти случаи, когда они действительно полезны. Постоянные выражения не должны быть полуслучайным подъязыком С++, отсутствием случайных функций, насколько мы можем этого избежать. В эти дни запятые верхнего уровня запрещены главным образом потому, что константные выражения имеют тенденцию возникать в контексты, где запятая будет означать что-то еще.

Обратите внимание, что было указано, что его пример С++ 11 неверен, поскольку выражение, содержащее оператор запятой, должно быть в (), но его пример дает суть аргумента. Аргумент будет основан на грамматике из раздела 5.19 выражения Constant:

constant-expression:
   conditional-expression

мы не можем перейти к оператору запятой из условного выражения, но мы можем перейти к первичному выражению, которое приведет нас к ( expression ), и мы сможем затем перейти к оператору запятой из выражения.

T.C. указывает, что это может быть не так, поскольку соответствующий раздел кажется неопределенным в этой точке.