Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 射程-v3随动变平_C++_Range V3 - Fatal编程技术网

C++ 射程-v3随动变平

C++ 射程-v3随动变平,c++,range-v3,C++,Range V3,我试图用views::join和views::move将容器的容器展平到一个维度,但我很难理解move first and join与join and move之间的区别。Try2按预期工作,但有人能帮助我了解引擎盖下发生了什么,导致Try1最终复制?在某个地方,这一举措不起作用。谢谢 wandbox链接到代码: #包括 #包括 #包括 #包括 int main() { 自动字=std::vector{ {“你好”,“世界”}, {“尼”,“好”} }; //Try1 自动结果1=单词

我试图用views::join和views::move将容器的容器展平到一个维度,但我很难理解move first and join与join and move之间的区别。Try2按预期工作,但有人能帮助我了解引擎盖下发生了什么,导致Try1最终复制?在某个地方,这一举措不起作用。谢谢

wandbox链接到代码:

#包括
#包括
#包括
#包括
int main()
{     
自动字=std::vector{
{“你好”,“世界”},
{“尼”,“好”}
};
//Try1
自动结果1=单词
|范围::视图::移动
|范围::视图::连接
|范围::到();

std::cout
移动
表示从对象移动的对象处于有效但未指定的状态。这并不意味着从对象移动的对象将被清除。因此两个输出都完全有效

我的猜测是,由于小字符串优化,第一个
移动
不会删除原始字符串,这可能是更有效的方法

事实上,如果第一个
移动
实际上是从
单词
移动的,那么
result2
将包含所有空字符串。同样,这将是完全有效的。

这是“如何修复”答案,没有解释“为什么”部分。我不知道如何记录此行为,在即将发布的C++20中没有指定

在您的示例中,在
join
之间添加第二个
ranges::views::move
操作就足够了

auto result1 = words
    | ranges::views::move
    | ranges::views::join
    | ranges::views::move
    | ranges::to<std::vector<std::string>>();

std::cout<<ranges::views::all(ranges::views::join(words))<<std::endl;
auto result1=单词
|范围::视图::移动
|范围::视图::连接
|范围::视图::移动
|范围::到();

std::coutBut处于SSO下是输入字符串的属性,不是吗?我不知道如何解释关于不一致性的问题,即
join | move
使字符串为空,但在同一字符串上的
move | join
不会。处于SSO下应该在两次尝试中都被转移。不,这不是必需的。实现可能会在某些情况下,ose可能会移动,但在其他情况下不会移动。
auto result1 = words
    | ranges::views::move
    | ranges::views::join
    | ranges::views::move
    | ranges::to<std::vector<std::string>>();

std::cout<<ranges::views::all(ranges::views::join(words))<<std::endl;