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

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

int a[ (1, 2) ] ;

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

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

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

20

Решение

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

Для 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 ) и тогда мы сможем добраться до оператор запятой от выражение.

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

18

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector