Лямбда может принимать свои аргументы как ссылки. Проблема в том, что в вашем примере они не являются const-ref, а std::stable_sort
передает значения const,
comp
[...] Подпись Функция сравнения должна быть эквивалентна следующему:
bool cmp(const Type1 &a, const Type2 &b);
Хотя подпись не обязательно должна иметь const &
, , функция не должна изменять переданные ей объекты и должна иметь возможность принимать все значения типа (возможно const
) Type1
и Type2
независимо от категории значения (таким образом, Type1 &
не допускается , равно как и Type1
, если для Type1
перемещение не эквивалентно копированию (начиная с C ++ 11)).
, который нельзя преобразовать в неконстантную ссылку. Просто объявите лямбда, чтобы взамен const int&
:
stable_sort(nums.begin(), nums.end(),[](const int& a, const int& b) {
// ...
});
Ошибка компилятора - мертвая распродажа (имя файла для краткости усечено):
bits/predefined_ops.h:177:11: error: no match for call to ‘(moveZeroes(std::vector<int>&)::<lambda(int&, int&)>) (int&, const int&)’
177 | { return bool(_M_comp(*__it, __val)); }
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
bits/predefined_ops.h:177:11: note: candidate: ‘bool (*)(int&, int&)’ <conversion>
bits/predefined_ops.h:177:11: note: conversion of argument 3 would be ill-formed:
bits/predefined_ops.h:177:11: error: binding reference of type ‘int&’ to ‘const int’ discards qualifiers