fold表达式:右移初始化行为

Gab*_*ard 0 c++ fold-expression c++17

我很乐意使用折叠表达式来更好地理解我可以在项目中使用它们的位置.所以我选择用简单的方式初始化它们

(datas = ... = 1);
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切都按预期工作,每个值都是1.然后我尝试使用左移初始化,所以:

    (datas = ... = 1);
    (datas <<= ...);
Run Code Online (Sandbox Code Playgroud)

这也是我期望的工作,它增加2的力量它很好.最后我尝试了这个:

(datas = ... = 1);
(datas >>= ...);
Run Code Online (Sandbox Code Playgroud)

并且它给我输出a 0, 1, 0, 1, 0, 1, ...,我预计它将全部为0.所以这里的代码:

#include <iostream>

template<typename... T>
void test(T&&... datas) {
    (datas = ... = 1);
    (datas >>= ...);
    (std::cout << ... << (std::to_string(datas) + " ")) << std::endl;
}

int main(int argc, char const *argv[])
{
    int v1, v2, v3, v4;
    test(v1, v2, v3, v4);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么它是0, 1, 0, 1等而不是0, 0, 0, 0?我通过每个论点它会做更多这样的事情: arg1 >>= arg2, arg2 >>= arg3, arg3 >>= arg4, etc 但是确实那么最后一个值应该是1然后它也可以0, 0, 0, 1.

mol*_*ilo 5

就是这样,因为你的折叠是

arg1 >>= arg2 >>= arg3 >>= arg4;
Run Code Online (Sandbox Code Playgroud)

arg3 >> arg4是的1 >> 1,arg3变成了0.
然后,arg2 >> arg31 >> 0,arg2变成了1.
然后,arg1 >> arg21 >> 1,arg1变成了0.

因此,0, 1, 0, 1.

我认为这里的教训是"突变和折叠不混合".