问题标签 [fold-expression]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
149 浏览

c++ - C++17 参数包编译错误

我有一个来自互联网的程序,如下所示,以展示 C++17 中“参数包”的能力

但是当我用 g++5.3 和 6.1 用 -std=c++17 编译它时,报错了,我不明白错误信息是关于什么的:

你能帮忙解释一下吗?非常感谢。

0 投票
1 回答
944 浏览

c++ - C++17:integer_sequence 使用与编译错误

我希望使用 integer_sequence 来判断一个数字范围是否都在某个值以下: is_range() 将返回 true,否则返回 false,如下所示:

我用clang3.8编译它,但是失败了。

我应该如何更正我的代码?我想我对折叠表达式的理解是不正确的

如何纠正它?

0 投票
1 回答
847 浏览

c++ - 折叠表达式和空参数包:预期结果是什么?

考虑以下最小示例:

注释行无法编译。
这同样适用于使用*而不是+
涉及布尔值的那个可以代替。

在这里(工作草案)我没有找到关于空参数包的提及。
另一方面,这里(isocpp)似乎上述情况下的默认结果是int().

混合折叠表达式和空参数包时的预期行为到底是什么?

0 投票
1 回答
3359 浏览

c++ - cout 中的 C++17 折叠表达式

我正在学习新的 c++17 fold expression,我从c++17 fold expression看到了这段代码。我想知道为什么这段代码有效:

但不是这个:

在我看来,这似乎也是合乎逻辑的,并且会颠倒打印顺序。

0 投票
0 回答
352 浏览

c++ - 在折叠表达式中声明 void 变量阴影模板参数

以下g++行为是错误吗?

给出错误消息:

main.cpp:在函数中constexpr bool f(int, std::index_sequence<i ...>)

main.cpp:11:33:错误:void i阴影模板参数的声明

main.cpp:7:11:注意:i此处声明的模板参数

活生生的例子。

void到改变static_cast< void >使错误停止。

k从左边乘以也使错误停止。

std::size_t这是为了避免这个 g++错误。

我知道,该声明int (i),相当于int i,在几个上下文中,但不是在内置逗号运算符的 lhs 部分中。而且,它是一个void变量声明。

0 投票
2 回答
1575 浏览

c++ - 使用折叠表达式将参数包扩展为 lambda - gcc vs clang

考虑以下代码片段:

clang++ 3.8+成功编译代码

g++ 7.0编译失败,出现以下错误:

删除post调用和 lambda使 g++ 编译折叠表达式

lambda、折叠表达式和模板函数调用之间的这种交互是否被标准以某种方式禁止,或者这是一个 gcc 错误?

0 投票
0 回答
112 浏览

c++ - 是否可以保证使用折叠表达式的参数包扩展的编译复杂性

当所有类型的参数包都相同时,我可以想象一个直接有效的折叠表达式扩展实现(简化的 c++11 示例):

当然,当我们考虑更一般的情况时,即当我们不能真正假设类型相同时,我们可以将引用替换为参数类型std::array的引用。std::tuple然而,在这种情况下,元组本身很可能会导致扩展的复杂性随着参数数量的对数增长。

它可以使编译器在本质上处理折叠表达式,以确保扩展的复杂性是,但是在[expr.prim.fold]O(N)部分的 C++ 标准草案中,我看不到对此的保证。

我们可以假设使用折叠表达式扩展参数包很便宜吗?

0 投票
1 回答
816 浏览

c++ - 如何在“折叠表达式”中也可以使用“短路评估”?

传统&&算子支持短路求值,所以false && (*pb = true)在运行时会ok,但下面两种情况不行。

如何使短路评估也可用fold expressions

0 投票
2 回答
3213 浏览

c++ - 使用折叠表达式打印所有带有换行符的可变参数

C++17 折叠表达式的经典示例是打印所有参数:

例子:

输出:

我想在我的输出中添加换行符。但是,我找不到这样做的好方法,这是迄今为止我发现的最好的方法:

然而,这不是零开销,因为它ostringstream为每个参数构造了一个临时的。

以下版本也不起作用:

我明白为什么最后两个版本不起作用。使用折叠表达式是否有更优雅的解决方案来解决这个问题?

0 投票
1 回答
374 浏览

c++ - 在折叠表达式中使用 lambda 时出现“未初始化的捕获引用”错误 - clang vs gcc

考虑以下代码:


调用和打印fold_left(cat, a, b, c)时,g++7 和 clang++5 都输出:

((a, b), c)


调用和打印fold_left(cat, a, b, c, d) (超过 3 个参数)时,clang++5 输出:

(((A B C D)

相反 g++7 会产生一个奇怪的编译时错误(缩短)

wandbox 上的实时示例


我的代码是否由于某种原因格式错误,或者这是一个 g++7 错误