c – STL容器的rvalue ref-qualifiers
为什么元素访问STL容器的成员函数,例如std :: array :: operator []或std :: vector :: operator []没有rvalue ref-qualifier重载?当然我可以做std :: move(generate_vector()[10]),但我很好奇是否在标准化ref-qualifiers时考虑添加rvalue ref-qualifier重载.
我认为std :: array< T,N>和std :: tuple< T,T,...,T>实际上是相同的,并且后者的“元素访问函数(即std :: get)”对于const与非const和lvalue与rvalue的所有组合都被重载.为什么不是前者? 将rvalue ref限定的元素访问成员函数(返回rvalue引用)添加到我的自定义容器中是一个好主意吗? 编辑 致Richard Critten的评论.我认为这偶尔会有用. 例如,您有一个函数返回在该函数内构造的容器,但您可能只对该容器的第一个元素感兴趣.是的,那太傻了.在这种情况下,使用仅构造第一个元素的简单函数肯定会更好.但如果功能不是你的,你没有这样的选择. 或者,可能有更一般的例子.您有一个构造容器的函数,并且您希望处理该容器以获得另一个结果. EDIT2 事实上,当我向容器类实现一些“视图”类时,我遇到了这个问题.似乎都需要可变视图(左值引用),不可变视图(const引用)和可移动视图(右值引用),并且我必须确定从可移动视图类的元素访问成员函数返回的内容:左值或右值引用?对我来说感觉有点奇怪,将rvalue引用返回到容器本身不公开这些接口的元素.哪一个是正确的? >左值参考. 解决方法
将ref-qualifiers添加到返回引用的所有内容中没有特别的问题,但是这基本上会使成员数量增加一倍,除了在std :: move中包装返回之外,它们通常具有相同的实现.
class A { int a; int& operator[](std::size_t pos) & { return a; } int&& operator[](std::size_t pos) && { return std::move(a); } }; 标准库拒绝提供这些重载,就像它拒绝提供许多易失性重载一样.在这种情况下,你可以只是std :: move the&价值,你需要它. 如果您正在编写自己的容器,那么就没有安全的理由来避免这种过载.它确实增加了维护负担,所以我建议不要这样做. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |