3

我已经向 GCC 打开了一个错误,但我想知道我的期望是否正确。

考虑这个提议和下面的折叠表达式:

(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>(), "!");
}

断言在编译时失败(GCC 6.1.0)。
由于提案中包含的内容,我希望它能够编译。
它应该成功,因为它等效于上面不涉及折叠表达式的示例。
解压后的表达式确实应该是:((0 < 42) < 3)。

我是对的还是我在这里遗漏了一些关于折叠表达式的重要内容?

4

1 回答 1

4

N4191 是最初的提议。GCC 的C++1z 状态页面指出它实现了N4295中的修订提案。

左右折叠的规则发生了变化,我相信你的代码现在需要产生一个正确的折叠,0 < (42 < 3)false.

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

于 2016-06-11T15:37:37.293 回答