我正在学习新的c ++ 17 fold表达式,我从c ++ 17 fold表达式中看到了这段代码.我想知道为什么这段代码有效:
template<typename ...Args>
void printer(Args&&... args) {
(std::cout << ... << args) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
但不是这个:
template<typename ...Args>
void printer(Args&&... args) {
(std::cout << args << ...) << '\n';
}
Run Code Online (Sandbox Code Playgroud)
这看起来似乎也很合理,并且在我看来会扭转打印顺序.
我已经知道是什么了const_cast.但是我想知道它是如何完成这项工作的.编译器在看到它时到底做了const_cast什么?
我很乐意使用折叠表达式来更好地理解我可以在项目中使用它们的位置.所以我选择用简单的方式初始化它们
(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)
为什么它是 …