When answering the question at first, they are actually not constants. You cannot bind it to a non-constant link. This was probably done to prevent errors in certain situations when they were passed as a parameter to a function that modifies them, only to make changes to a temporary object, and not for the intended purpose.
Allowing non-constant operations in temporary mode is especially useful if you want to call "swap" on it with a local variable.
std::vector<T> local; method_that_returns_a_vector().swap( local );
Until the semantics of semantic days, this was considered the most efficient way to return a large data set and retrieve it without copying all the data.
source share