В процессе ответа на этот вопрос на SO для С++ 11 я понял, что в С++ 03 (а также в C) использование оператор запятой явно запрещен в постоянном выражении.
В параграфе 5.19/1 стандарта С++ 03 для постоянных выражений говорится:
[...] В частности, кроме выражения sizeof, функций, объектов класса, указателей или ссылки не должны использоваться, а назначение, приращение, декремент, функциональный вызов или запятые должны не используется.
В С++ 11, однако, последняя часть, в которой упоминается оператор запятой, кажется, исчезла. И хотя в параграфе 5.19/2 Стандарта С++ 11 четко указывается, что выражения вызова функции присваивания, приращения, декремента и не constexpr
не должны выступать в качестве подвыражений константного выражения, использование оператора запятой кажется, больше не запрещается.
Например, следующая программа компилируется в GCC 4.7.2 и Clang 3.3 с помощью std=c++11
(кроме предупреждений компилятора, говорящих, что оператор запятой не действует, а переменные x
и arr
не используются):
int main()
{
constexpr int x = (0, 42);
int arr[(0, 42)];
}
Однако следует сказать, что даже следующая программа компилируется с опцией -std=c++03
(как на Clang, так и на GCC), что явно неверно, учитывая приведенную выше цитату из стандарта С++ 03:
int main()
{
int arr[(0, 42)];
}
Вопрос:
Есть ли разница между С++ 03 и С++ 11 относительно того, разрешен ли оператор запятой в постоянном выражении, или я что-то не хватает?
В качестве бонусного (неконструктивного) вопроса мне было бы интересно узнать, почему оператор запятой не может использоваться в постоянном выражении в С++ 03.