У меня есть функция, которая сортирует два вектора с первым из них в качестве критерия упорядочения. Его подпись
template<typename A, typename B>
void sort(A&& X, B&& Y)
{
..
}
Проблема в том, что универсальные ссылки допускают такие бессмысленные случаи, как
sort(vector<int>{ 2,1,3 }, vector<int>{ 3,1,2 });
где значение r будет впоследствии уничтожено (ерунда).
Явный запрос lvalue не работает, так как
template<typename A, typename B>
void sort(A& X, B& Y) ... // (*)
sort(vector<int>{2,1,3}, vector<int>{3,1,2});
по какой-то причине приведенное выше компилируется (я думал, что только const lvalues можно привязывать к rvalue и продлевать их время жизни?).
Если я добавлю const
к ссылке lvalue, функция больше не сможет изменять векторы и сортировать их.
Мои вопросы:
1) Почему в примере, отмеченном // (*)
, я могу привязать значение r к значению l, которое даже не равно const
? Почему вместо этого что-то вроде int& r = 20;
не разрешено? Какая разница?
2) Как я могу решить мою проблему, т.е. сделать так, чтобы функция принимала только lvalue, а не временные значения rvalue? (если это возможно, конечно)
Очевидно, мне разрешено использовать любую доступную версию C++.