c++ - GCC 以错误的方式解压 (I < ...) 折叠表达式

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

<分区>

我打开了一个 bug到 GCC,但我想知道我的期望是否正确。

考虑 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).

我是对的还是我遗漏了一些关于折叠表达式的重要信息?

最佳答案

N4191 是最初的提议。 GCC 的 C++1z status page注意到它在 N4295 中实现了修订后的提案.

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

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

关于c++ - GCC 以错误的方式解压 (I < ...) 折叠表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37765347/

相关文章:

c++ - 将模板与作用域在函数内的匿名类一起使用

c++ - clang-format 如何不将 if 语句放在一行中?

C++:当我定义运算符时,所有成员函数都给出隐式定义错误

c++ - 在C++非类型模板参数中使用decltype(auto)

c++ - GDIplus 比例位图

python - Boost - 无法包装传入变量

c++ - 确定方法或成员是否可以 protected 或私有(private)

c++ - 带有 "noexcept"构造函数的程序被 gcc 接受,被 clang 拒绝

c++ - 结构化绑定(bind)和 tie()

c++ - 是否允许删除修改其参数?