2026-08-25
fold_direction.cpp
#include <iostream>
template <typename... Args>
auto right_fold(Args... args) {
return (args - ...);
}
template <typename... Args>
auto left_fold(Args... args) {
return (... - args);
}
int main() {
std::cout << right_fold(1, 2, 3, 4) << ' ' << left_fold(1, 2, 3, 4) << '\n';
}
これは何を出力するでしょうか?
Answer
-2 -8(その後に改行)。単項右畳み込み(args - ...)は1 - (2 - (3 - 4))と結合するので-2、単項左畳み込み(... - args)は((1 - 2) - 3) - 4と結合するので-8になります。畳み込み式の結合方向は書き方(...を左右どちらに置くか)で決まり、-のような非可換な演算子では方向によって結果が変わります。