答案 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)
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>