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

时间:2017-12-07 12:40:18

标签: c++ c++17 fold-expression

我很喜欢使用折叠表达式来更好地理解我可以在项目中使用它们的位置。所以我选择用简单的

初始化它们
(datas = ... = 1);

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

    (datas = ... = 1);
    (datas <<= ...);

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

(datas = ... = 1);
(datas >>= ...);

它给我输出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;
}

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

2 个答案:

答案 0 :(得分:5)

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

arg1 >>= arg2 >>= arg3 >>= arg4;

arg3 >> arg41 >> 1,因此arg3变为0 然后,arg2 >> arg31 >> 0,因此arg2变为1 然后,arg1 >> arg21 >> 1,因此arg1变为0

因此,0, 1, 0, 1

我认为这里的教训是&#34;突变和折叠不会混合&#34;

答案 1 :(得分:1)

(datas >>= ...)相当于d1 >>= (d2 >>= (d3 >>= d4));

证明:

#include <iostream>

template<typename...Ts>
void set(Ts&&... datas)
{
    (datas = ... = 1);
}

template<typename...Ts>
void print(Ts&&... datas)
{
    (std::cout << ... << (std::to_string(datas) + " ")) << std::endl;
}

template<typename... T>
void test(T&&... datas) {
    set(datas...);
    (datas >>= ...);
    print(datas...);
}

void test2(int& d1, int& d2, int& d3, int& d4)
{
    set(d1,d2,d3,d4);
    d1 >>= (d2 >>= (d3 >>= d4));
    print(d1,d2,d3,d4);
}

int main(int argc, char const *argv[])
{
    int v1, v2, v3, v4;
    test(v1, v2, v3, v4);
    test2(v1, v2, v3, v4);
    return 0;
}

预期结果:

0 1 0 1 
0 1 0 1 

http://coliru.stacked-crooked.com/a/e0435451bcf8af70