以下是合法的折叠表达式吗?
template <std::size_t N, std::size_t... Ix>
bool in_range(std::index_sequence<Ix...>) {
return ((Ix < N) && ...);
}
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) );
海湾合作委员会是错误的。这是错误 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 )
,因此它是主表达式,因此它是后缀表达式,因此它是一元表达式,因此它是强制转换表达式,因此它可以用作折叠表达式的操作数.