我已经向GCC开了bug,但我想知道我是否符合我的期望。
考虑this提案和以下折叠表达式:
(args < ...)
它应该相当于:
((args$0 < args$1) < ...) < args$n
请考虑以下代码:
#include <cassert>
int main() {
assert((0 < 42) < 3);
}
断言编译并正常工作,它不会失败(正如预期的那样,注意结果不是((0 <42)和(42 <3)),表达式本身是非常不寻常的无意义的。
另一方面,使用折叠表达式时:
template<int... I>
static constexpr bool f() {
return (I < ...);
}
int main() {
static_assert(f<0, 42, 3>(), "!");
}
编译时断言fails(GCC 6.1.0) 由于提案中包含的内容,我希望它能够编译 它应该成功,因为它等同于上面没有涉及折叠表达式的例子 解包的表达式确实应该是:((0 <42)<3)。
我是对的,还是我错过了关于折叠表达的重要内容?
答案 0 :(得分:4)
N4191是最初的提案。海湾合作委员会C++1z status page指出,它在N4295中实施了修订后的提案。
左右折叠的规则已更改,我相信您的代码现在需要生成正确的折叠,即0 < (42 < 3)
,即false
。
I < ...
是正确的折叠; ... < I
将是左侧折叠。