为什么C++11中移除了常量表达式中逗号运算符的限制?

21

最近当回答一个问题时,我意识到在C++11中,只要表达式被()包围,逗号运算符就可以在常量表达式中使用,例如:

int a[ (1, 2) ] ;

Pre C++11禁止在常量表达式中使用逗号运算符,来自于预C++11标准的第5.19常量表达式,其中写道(重点在于):

[...]特别地,在sizeof表达式中除外,不得使用函数、类对象、指针或引用,并且不得使用赋值、增量、减量、函数调用或逗号运算符

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

1个回答

20
我们可以在std-discussion组的Comma operator in constant-expression主题中找到答案,Gabriel Dos Reis在那里说:

对于C++11,我建议允许使用逗号运算符,因为该限制似乎是武断的。我听到的所有禁止使用逗号运算符的理由都对我来说非常不可信和牵强。

而Richard Smith在主题早期的部分earlier in the thread中指出了在C++11和C++14中在常量表达式中使用逗号运算符的一些用法:

I disagree with your argument and your conclusion. In C++11, the comma operator is useful within constexpr functions, because we aren't allowed multiple statements:

template<typename T>   constexpr T my_array<T>::at(size_type n) {
  return (n < size() || throw "n too large"), (*this)[n];   }

In C++14, it's useful in essentially all of the cases where it's useful outside of constant expressions:

constexpr void do_stuff(int x[]) {
  for (int i = 0, j = 100; i != j; ++i, --j)
    x[i] = x[j];   }

More philosophically, we shouldn't ban things from constant expressions simply because we're not imaginative enough to find the cases where they're genuinely useful. Constant expressions should not be a semi-random sublanguage of C++, missing random features, to the extent that we can avoid that. These days, top-level commas are prohibited mostly because constant-expressions tend to occur in contexts where a comma would mean something else.

请注意,有人认为他的C++11示例不正确,因为包含逗号运算符的表达式应该在()中,但他的示例给出了论点的要点。该论点基于第5.19常量表达式的语法。
constant-expression:
   conditional-expression

我们无法从一个条件表达式直接到达逗号运算符,但我们可以通过访问基本表达式来到达 (expression),然后再从表达式到达逗号运算符。 T.C. 指出,由于相关部分在这一点上似乎含糊不清,因此可能并非如此。

我可能会解释一下为什么在C++11中需要()(这是语法要求,需要一个条件表达式)。 - T.C.
@T.C. 说得好,我正在通勤,暂时无法进行真正的编辑,但我在上面的问题中提供的链接中解决了这个问题。 - Shafik Yaghmour
1
我也不太确定Richard Smith的C++11示例是否正确。对constexpr函数的调用是一个“条件表达式”,因此符合语法,所以问题是当调用被“函数调用替换”时,是否产生一个常量表达式,而[dcl.constexpr]/p5中的规范对于“函数调用替换”所产生的确切表达式非常模糊。 - T.C.
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Shafik Yaghmour
所以我不确定“尽管我认为理查德的观点在其他方面并没有多大意义。”是关于什么的? - T.C.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接