10

以下是合法的折叠表达式吗?

template <std::size_t N, std::size_t... Ix>
bool in_range(std::index_sequence<Ix...>) {
  return ((Ix < N) && ...);
}

它用clang但不是gcc 编译

4

2 回答 2

9

Clang 的做法是正确的,Folding expressions Proposal的语法如下:

fold-expression:
      ( cast-expression fold-operator ... )
      ( ... fold-operator cast-expression )
      ( cast-expression fold-operator ... fold-operator cast-expression )

并包含适用于本案的以下措辞(强调我的):

其中 op 是折叠运算符的 (... op e) 形式的表达式称为一元左折叠。其中 op 是折叠运算符的 (e op ...)形式的表达式称为一元右折叠。一元左折叠和一元右折叠统称为一元折叠。在一元折叠中,强制转换表达式应包含未扩展的参数包。

并且(Ix < N)确实是一个演员表,所以这看起来是有效的。我们可以看到将我们带到那里的链,如下节中的语法所示5

cast-expression -> unary-expression -> postfix-expression -> 
 primary-expression -> (expression)

TC 在折叠表达式时指出以下 gcc 错误报告[c++1z]“折叠表达式的操作数中的二进制表达式”错误,该错误报告了类似的问题,但仍未得到证实。

看起来这在 gcc 中也被打破了二进制左右折叠,例如:

return ( (Ix < N) && ... &&  (N < 10) );

和:

return ( (N < 10) && ... &&  (Ix < N) );
于 2015-11-17T03:10:58.627 回答
4

海湾合作委员会是错误的。这是错误 68377,可能是由错误 67810的修复引入的。

fold-expression:    
    ( cast-expression fold-operator ... )
    [...]

primary-expression:    
    [...]
    ( expression )
    [...]

postfix-expression:    
    primary-expression
    [...]

unary-expression:    
    postfix-expression
    [...]

cast-expression:
    unary-expression
    [...]

(Ix < N)是形式的( expression ),因此它是主表达式,因此它是后缀表达式,因此它是一元表达式,因此它是强制转换表达式,因此它可以用作折叠表达式的操作数.

于 2015-11-17T03:12:33.693 回答