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

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

int a[ (1, 2) ] ;

Pre C ++ 11 it запрещено использовать оператор запятой в константном выражении из чернового раздела 5.19 Постоянные выражения до C ++ 11, в котором говорится (выделено мной ):

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

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


person Shafik Yaghmour    schedule 05.12.2014    source источник


Ответы (1)


Мы можем найти ответ на этот вопрос в стандартном обсуждении группа Оператор-запятая в потоке с постоянным выражением, где Габриэль Дос Рейс говорит:

Для 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
comment
Я бы, вероятно, объяснил также, почему () требуется в C ++ 11 (это грамматика, которая требует условного выражения). - person T.C.; 06.12.2014
comment
@ T.C. Справедливо, я езжу на работу и не смогу немного по-настоящему отредактировать, но я обращаюсь к этому по ссылке , которую я предоставляю в вопросе выше. - person Shafik Yaghmour; 06.12.2014
comment
Я также не совсем уверен, неверен ли пример Ричарда Смита C ++ 11. Вызов функции constexpr является условным-выражением и, следовательно, соответствует грамматике, поэтому вопрос заключается в том, производит ли вызов при замене подстановкой вызова функции постоянное выражение, а спецификация в [dcl .constexpr] / p5 удивительно расплывчато описывает точное выражение, полученное с помощью подстановки вызова функции. - person T.C.; 06.12.2014
comment
@ T.C. Хммм, интересный вопрос. Он не возражал с этой оценкой во время обсуждения, но это не значит, что она верна. Я должен подумать об этом. - person Shafik Yaghmour; 06.12.2014
comment
Правильно ли написана его функция из примера constexpr или отсутствует пара круглых скобок, я не понимаю, как это влияет на точку зрения Ричарда о том, что использование запятой полезно для constexpr функций. - person T.C.; 06.12.2014
comment
Так что я не уверен, что именно. Хотя я бы сказал, что в противном случае точка Ричарда не имеет особого смысла. около? - person T.C.; 06.12.2014
comment
@ T.C. Теперь я вижу, как это было непонятно, я убрал это предложение. - person Shafik Yaghmour; 06.12.2014