为什么STL容器的元素访问成员函数(例如std::array::operator[]或std::vector::operator[])没有rvalue ref-qualifier重载?当然我可以使用std::move(generate_vector()[10]),但我很好奇在标准化ref-qualifiers时是否考虑添加rvalue ref-qualifier重载。
我认为std::array和std::tuple实际上是相同的东西,后者的“元素访问函数(即std::get)”针对const vs non-const和lvalue vs rvalue的所有组合都进行了重载。为什么前者没有?
向我的自定义容器添加返回rvalue引用的rvalue ref-qualified元素访问成员函数是否是个好主意?
编辑
对于Richard Critten的评论。我认为这可能偶尔会有用。
例如,您有一个在函数内构造的容器并返回该容器的函数,但您可能只对该容器的第一个元素感兴趣。是的,这很傻。在这种情况下,肯定最好使用仅构造第一个元素的简单函数。但是如果该函数不是您的,您就没有这样的选择。
或者,可能会有更一般的例子。您有一个构造容器的函数,并希望处理该容器以获得另一个结果。 例如,您可能希望对该容器执行std::reduce或std::unique_copy。(似乎在执行std::reduce期间禁止修改元素,但是让我们假设我们已经实现了允许修改的自己的函数。)在这种情况下,可以使用std::make_move_iterator,但为什么不让容器本身返回移动迭代器呢?
编辑2
事实上,当我正在为容器类实现一些“视图”类时,我遇到了这个问题。需要可变视图(lvalue引用)、不可变视图(const引用)和可移动视图(rvalue引用),我必须确定可移动视图类的元素访问成员函数应该返回lvalue还是rvalue引用?对我来说,将rvalue引用返回给容器本身不公开此类接口的元素感觉有点奇怪。哪一个是正确的?
1. lvalue引用。 2. rvalue引用。 3. 通常来说,可移动视图并不正确。这样的东西不应该经常需要,并且我的设计中应该存在一些严重的问题。
我认为std::array和std::tuple实际上是相同的东西,后者的“元素访问函数(即std::get)”针对const vs non-const和lvalue vs rvalue的所有组合都进行了重载。为什么前者没有?
向我的自定义容器添加返回rvalue引用的rvalue ref-qualified元素访问成员函数是否是个好主意?
编辑
对于Richard Critten的评论。我认为这可能偶尔会有用。
例如,您有一个在函数内构造的容器并返回该容器的函数,但您可能只对该容器的第一个元素感兴趣。是的,这很傻。在这种情况下,肯定最好使用仅构造第一个元素的简单函数。但是如果该函数不是您的,您就没有这样的选择。
或者,可能会有更一般的例子。您有一个构造容器的函数,并希望处理该容器以获得另一个结果。 例如,您可能希望对该容器执行std::reduce或std::unique_copy。(似乎在执行std::reduce期间禁止修改元素,但是让我们假设我们已经实现了允许修改的自己的函数。)在这种情况下,可以使用std::make_move_iterator,但为什么不让容器本身返回移动迭代器呢?
编辑2
事实上,当我正在为容器类实现一些“视图”类时,我遇到了这个问题。需要可变视图(lvalue引用)、不可变视图(const引用)和可移动视图(rvalue引用),我必须确定可移动视图类的元素访问成员函数应该返回lvalue还是rvalue引用?对我来说,将rvalue引用返回给容器本身不公开此类接口的元素感觉有点奇怪。哪一个是正确的?
1. lvalue引用。 2. rvalue引用。 3. 通常来说,可移动视图并不正确。这样的东西不应该经常需要,并且我的设计中应该存在一些严重的问题。
&
和&&
重载,它没有T
重载,因为那不能区分元素。 - Calethstd::get<bool>
获取std::tuple<int, char, bool>
的值,但对于std::array<bool, 10>
则没有意义。C++17增加了第四个版本的const &&
,适用于std::get (std::array)
和std::get (std::tuple)
两者。 - Caleth