C++ 为什么在C++;11?

C++ 为什么在C++;11?,c++,c++11,language-lawyer,c++03,constant-expression,C++,C++11,Language Lawyer,C++03,Constant Expression,最近,我意识到只要表达式被()包围,中的常量表达式中就可以使用逗号运算符,例如: int a[ (1, 2) ] ; 禁止在常量表达式中使用逗号运算符,从C++11之前的草案标准部分5.19常量表达式中可以看出(重点是我的): […]特别是,除了sizeof表达式、函数、类之外 不得使用对象、指针或引用,以及赋值, 不得使用递增、递减、函数调用或逗号运算符 已使用。 为什么在C++11之前的常量表达式中不允许使用逗号运算符?为什么取消了此限制?我们可以在组线程中找到答案,Gabriel Dos

最近,我意识到只要表达式被
()
包围,中的常量表达式中就可以使用逗号运算符,例如:

int a[ (1, 2) ] ;
禁止在常量表达式中使用逗号运算符,从C++11之前的草案标准部分
5.19
常量表达式中可以看出(重点是我的):

[…]特别是,除了sizeof表达式、函数、类之外 不得使用对象、指针或引用,以及赋值, 不得使用递增、递减、函数调用或逗号运算符 已使用。


为什么在C++11之前的常量表达式中不允许使用逗号运算符?为什么取消了此限制?

我们可以在组线程中找到答案,Gabriel Dos Reis说:

对于C++11,我建议允许它,因为出现了限制 我所听到的作为禁令理由的武断的和所有的理由都出现了 对我来说非常不可信和似是而非

Richard Smith注意到在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++的半随机子语言,缺少随机特征, 我们可以避免的程度。现在,顶级逗号是 主要是因为常量表达式往往出现在 逗号表示其他意思的上下文

注意,有人认为他的C++11示例是不正确的,因为包含逗号运算符的表达式应该在
()
中,但他的示例给出了该参数的实质。该参数将基于
5.19节
常量表达式中的语法:

constexpr void do_stuff(int x[]) {
  for (int i = 0, j = 100; i != j; ++i, --j)
    x[i] = x[j];   }
我们不能从条件表达式中得到逗号运算符,但我们可以从主表达式中得到
(表达式)
,然后我们可以从表达式中得到逗号运算符


T.C.可能不是这样,因为相关章节在这一点上似乎含糊不清。

我可能还会解释为什么C++11中需要
()
(这是语法,它需要一个条件表达式)。@T.C.Fair point,我正在上下班,暂时无法进行真正的编辑,但我在上面的问题中提到了这一点。我也不太确定Richard Smith的C++11示例是否正确。调用
constexpr
函数是一个条件表达式,因此符合语法,因此问题在于调用“被函数调用替换替换时”是否会生成一个常量表达式,以及[dcl.constexpr]中的规范/p5对于函数调用替换产生的精确表达式非常模糊。@T.C.Hmmm,有趣的问题。在讨论期间,他并不反对这一评估,但这并不意味着它是正确的。我必须考虑一下。无论他的示例
constexpr
函数编写是否正确,还是缺少一对括号,我都看不出这会如何影响Richard的观点,即允许逗号对
constexpr
函数有用。
constant-expression:
   conditional-expression