GCC以错误的方式解包(I< ...)折叠表达式

时间:2016-06-11 15:20:32

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

我已经向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)。

我是对的,还是我错过了关于折叠表达的重要内容?

1 个答案:

答案 0 :(得分:4)

N4191是最初的提案。海湾合作委员会C++1z status page指出,它在N4295中实施了修订后的提案。

左右折叠的规则已更改,我相信您的代码现在需要生成正确的折叠,即0 < (42 < 3),即false

I < ...是正确的折叠; ... < I将是左侧折叠。