Мы можем найти ответ на этот вопрос в стандартном обсуждении группа Оператор-запятая в потоке с постоянным выражением, где Габриэль Дос Рейс говорит:
Для C ++ 11 я предложил разрешить его, потому что ограничение выглядело произвольным, и все причины, которые я слышал в качестве обоснования его запрета, кажутся мне очень неубедительными и надуманными.
и Ричард Смит ранее в теме отмечает некоторые варианты использования оператора запятой в константном выражении как в C ++ 11, так и в C ++ 14:
Я не согласен с вашим аргументом и вашим выводом. В C ++ 11 оператор запятой полезен в функциях constexpr, потому что нам не разрешено использовать несколько операторов:
template<typename T> constexpr T my_array<T>::at(size_type n) {
return (n < size() || throw "n too large"), (*this)[n]; }
В C ++ 14 он полезен практически во всех случаях, когда он полезен вне константных выражений:
constexpr void do_stuff(int x[]) {
for (int i = 0, j = 100; i != j; ++i, --j)
x[i] = x[j]; }
Говоря более философски, мы не должны запрещать вещи из постоянных выражений просто потому, что мы недостаточно изобретательны, чтобы находить случаи, когда они действительно полезны. Постоянные выражения не должны быть полуслучайным подъязыком C ++, в котором отсутствуют случайные функции, насколько это возможно. В наши дни запятые верхнего уровня запрещены в основном потому, что выражения-константы, как правило, встречаются в контекстах, где запятая будет означать что-то еще.
Обратите внимание, что утверждалось, что его пример C ++ 11 неверен, поскольку выражение, содержащее оператор запятой, должно быть в ()
, но его пример дает суть аргумента. Аргумент будет основан на грамматике из раздела 5.19
Постоянные выражения:
constant-expression:
conditional-expression
мы не можем перейти к оператору запятой из условного-выражения, но мы можем перейти к первичному-выражению, который приведет нас к ( expression )
, и тогда мы сможем перейти к оператору запятой из выражения.
T.C. указывает на , что это может быть не так, поскольку соответствующий раздел кажется расплывчатым по этому поводу.
person
Shafik Yaghmour
schedule
05.12.2014