Namaran

Code daily. Without assist.

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になります。畳み込み式の結合方向は書き方(...を左右どちらに置くか)で決まり、-のような非可換な演算子では方向によって結果が変わります。