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

时间:2014-12-05 20:58:46

标签: c++ c++11 language-lawyer c++03 constant-expression

最近answering a question我意识到逗号运算符C++11中的常量表达式中被允许,只要表达式被()包围,例如:

int a[ (1, 2) ] ;

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

  

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

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

1 个答案:

答案 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这可能不是这种情况,因为相关部分在这一点上似乎含糊不清。