在回答关于 C++11的 SO 的这个问题的过程中,我意识到在 C++03(以及 C 中)中,在constant-expression中明确禁止使用逗号运算符。
C++03 Standard 关于常量表达式的第 5.19/1 段说:
[...] 特别是,除了 sizeof 表达式,不得使用函数、类对象、指针或引用,不得使用赋值、递增、递减、函数调用或逗号运算符。
然而,在 C++11 中,最后提到逗号运算符的部分似乎消失了。虽然 C++11 标准的第 5.19/2 段明确规定赋值、递增、递减和非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 上)编译良好,这显然是不正确的,鉴于上述 C++03 标准的引用:
int main()
{
int arr[(0, 42)];
}
问题:
C++03 和 C++11 在常量表达式中是否允许使用逗号运算符有区别,还是我遗漏了什么?
作为一个奖励(非建设性)问题,我很想知道为什么逗号运算符不能用于 C++03 中的常量表达式。