在回答的过程中这个问题关于SO https://stackoverflow.com/questions/16563114/are-these-null-pointers-or-are-they-pointers-to-address-0/16564608?noredirect=1#comment23807331_16564608对于 C++11,我意识到在 C++03(以及 C)中,在 a 中明确禁止使用逗号运算符。常量表达式.
C++03 标准关于常量表达式的第 5.19/1 段说:
[...] 特别是,除了 sizeof 表达式、函数、类对象、指针或
不得使用引用,以及赋值、递增、递减、函数调用或逗号运算符应
不被使用.
然而,在 C++11 中,最后一部分提到逗号运算符似乎消失了。虽然 C++11 标准第 5.19/2 段明确规定了赋值、递增、递减和非constexpr
函数调用表达式不应作为 a 的子表达式出现常量表达式,逗号运算符的使用似乎不再被禁止。
例如,以下程序在 GCC 4.7.2 和 Clang 3.3 上可以正常编译std=c++11
(除了编译器警告说逗号运算符无效并且x
and arr
变量未使用):
int main()
{
constexpr int x = (0, 42);
int arr[(0, 42)];
}
然而,必须说的是,即使下面的程序也可以很好地编译-std=c++03
选项(在 Clang 和 GCC 上),这显然是not正确的是,上面引用了 C++03 标准:
int main()
{
int arr[(0, 42)];
}
问题:
关于常量表达式中是否允许使用逗号运算符,C++03 和 C++11 之间是否存在差异,或者我是否遗漏了某些内容?
作为一个额外的(非建设性的)问题,我有兴趣知道为什么逗号运算符不能在 C++03 的常量表达式中使用。