最近answering a question我意识到逗号运算符在C++11中的常量表达式中被允许,只要表达式被()
包围,例如:
int a[ (1, 2) ] ;
Pre C++11禁止在常量表达式中使用逗号运算符,来自草案预C ++ 11标准部分5.19
常量表达式其中说(强调我的):
[...]特别是,除了sizeof表达式,函数,类 不得使用对象,指针或引用,以及赋值, 增量,减量,函数调用或逗号运算符不得 使用
为什么逗号运算符不允许在C ++ 11之前的常量表达式中,为什么解除了这个限制?
答案 0 :(得分:18)
我们可以在Gabriel Dos Reis所说的std-discussion群组Comma operator in constant-expression帖子中找到答案:
对于C ++ 11,我建议允许它,因为出现了限制 任意和所有我听说过其禁令的理由出现的原因 我非常难以置信和好奇。
和Richard Smith earlier in the thread在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
我们无法从条件表达式获取逗号运算符,但我们可以访问 primary-expression ,它将我们带到{{ 1}}然后我们可以从表达式转到逗号运算符。
T.C。 points out这可能不是这种情况,因为相关部分在这一点上似乎含糊不清。