你能在fold表达式中使用子表达式吗?

时间:2015-11-17 02:59:08

标签: c++ c++11 c++17 fold-expression

以下是合法的表达式吗?

$CATALINA_HOME/lib

它使用clang但不是gcc

进行编译

2 个答案:

答案 0 :(得分:9)

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

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

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

  

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

(Ix < N)确实是一个强制转换表达式,所以看起来有效。我们可以看到链接让我们在那里,如下面的5部分中的语法:

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

T.C。指出了以下gcc错误报告[c++1z] "binary expression in operand of fold-expression" error when folding an expression,它报告了类似的问题,但仍然未经证实。

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

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

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

答案 1 :(得分:4)

海湾合作委员会错了。这是bug 68377,可能是由bug 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 ),因此它是 primary-expression ,因此它是 postfix-expression ,因此它是一个一元表达式,因此它是 cast-expression ,因此它可以用作 fold-expression 的操作数。< / p>