20

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

int a[ (1, 2) ] ;

Pre C++11禁止在常量表达式中使用逗号运算符,来自 C++11 前标准部分的草案5.19 常量表达式,其中说(强调我的):

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

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

4

1 回答 1

19

我们可以在常量表达式线程中的标准讨论组逗号运算符中找到这个问题的答案,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++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

我们不能从条件表达式中得到逗号运算符,但我们可以得到使我们到达的主要表达式,然后我们可以从表达式中得到逗号运算符( expression )

TC指出,情况可能并非如此,因为相关部分在这一点上似乎含糊不清。

于 2014-12-05T20:58:46.037 回答