The standard C++ containers offer only one version of operator[]
for containers like vector<T>
and deque<T>
. It returns a T&
(other than for vector<bool>
, which I'm going to ignore), which is an lvalue. That means that in code like this,
vector<BigObject> makeVector(); // factory function
auto copyOfObject = makeVector()[0]; // copy BigObject
copyOfObject
will be copy constructed. Given that makeVector()
returns an rvalue vector
, it seems reasonable to expect copyOfObject
to be move constructed.
If operator[]
for such containers was overloaded for rvalue and lvalue objects, then operator[]
for rvalue containers could return an rvalue reference, i.e., an rvalue:
template<typename T>
container {
public:
T& operator[](int index) &; // for lvalue objects
T&& operator[](int index) &&; // for rvalue objects
...
};
In that case, copyOfObject
would be move constructed.
Is there a reason this kind of overloading would be a bad idea in general? Is there a reason why it's not done for the standard containers in C++14?
See Question&Answers more detail:os