Ответ 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 )
, и мы сможем затем перейти к оператору запятой из выражения.