我正在编写一些基于容器或可迭代对象的算法。基本上,我操作支持
在
当算法通过右值引用接受容器时,这意味着容器的内容也可以被取走。例如,如果我编写了一个名为
然而,随着C++1y的
同时,容器遵循值语义,因为它们是右值,移动它们的内容是有效的。
对于
这些视图并不总是将其内容视为
我的算法(例如
我正在寻找一种简洁明了的方法来区分容器和视图。是否有计划通过某些属性或标签区分C++1y中的
如果我成功阻止视图被意外移动,有时仍需要移动它们,因此我需要一种标记视图为可移动的方法,而不是作为右值引用。我怀疑一个
for( : )
风格迭代的对象(我很少直接使用for( : )
,而是遵循查找begin
和end
迭代器的方式)。在
std
库中,大多数可迭代对象都是容器。它们拥有自己的数据,并且让您查看它们。当算法通过右值引用接受容器时,这意味着容器的内容也可以被取走。例如,如果我编写了一个名为
concatinate
的函数,它接受两个vector
并返回第三个,如果两个vector
都被move
了,我们将想要重用第一个vector
,然后使用move_iterator
从第二个vector
中取出数据以提高效率。然而,随着C++1y的
string_view
和类似概念的类型,我们有了不是容器而是指向容器的视图的可迭代对象。从语义上讲,我认为视图的行为类似于指针,因此它们的“按值”复制是视图进入容器的复制,而不是它们所引用的数据。如果我通过右值引用获取string_view
风格的视图,则并不意味着它拥有内容:移动内容是不合理的,就像移动指针的内容一样,并不仅仅因为指针本身是一个右值。同时,容器遵循值语义,因为它们是右值,移动它们的内容是有效的。
对于
string_view
,这不是一个问题,但我编写了更通用的view
类,例如contiguous_range_view
,它允许您在vector
或array
或arr[]
的子集上执行操作,就好像它是一个非可变大小的缓冲区。这些视图并不总是将其内容视为
const
,但它们不拥有其内容。因此,视图是右值并不意味着它们的内容是右值!我的算法(例如
concatinate
)在这里遇到了问题。视图与容器几乎无法区分,而右值容器可以被移动,而右值视图则不能。返回视图的函数是一个很好的模式,因为视图在语义上是指针类型。我正在寻找一种简洁明了的方法来区分容器和视图。是否有计划通过某些属性或标签区分C++1y中的
string_view
,以便我可以模拟或挂钩?如果没有,是否有一个好的模式?如果我成功阻止视图被意外移动,有时仍需要移动它们,因此我需要一种标记视图为可移动的方法,而不是作为右值引用。我怀疑一个
make_move_range
函数可以解决这个问题(它将接受一个可迭代范围,并对 begin
和 end
应用 std::make_move_iterator
)。