clang 3.6 倍表达式 left/right

clang 3.6 fold expression left/right

我正在尝试使用 clang 3.6 '--std=c++1z' 的折叠表达式,但我不太明白。我正在测试的功能是:

auto minus = [](auto... args) { return (args - ...); };
...
std::cout << minus(10, 3, 2) << std::endl;

根据 n4191,我希望它展开为左折叠

(10 - 3) - 2

给出结果5,然而,结果是9,这似乎是一个正确的折叠扩展,即

10 - (3 - 2)

我是不是遗漏了什么或误解了 n4191? 谢谢

n4191 由 n4295 修订。据此,(e op ...) 形式的表达式是 一元右折叠 ,并且展开为:E1 op (... op (EN-1 op EN)),即作为右折叠展开。

这似乎与 n4191 所说的折叠方向相反。 Clang 3.6 实现了 n4295 提议,如图 here.

... - args 将是 一元左折叠 并向您想要的方向展开。