#c #lambda #reference #lower-bound
#c #лямбда #ссылка #нижняя граница
Вопрос:
Я пишу этот код:
std::vector<std::pair<std::string, std::string>> map_ = {{"b", "1"}, {"a", "2"}};
auto iter = std::lower_bound(map_.begin(), map_.end(), key,
[](auto p1, std::stringamp; rhs) { return p1.first < rhs; });
и получить такую ошибку компиляции:
error: no matching function for call to object of type '(lambda at /Users/bestasoff/.../static_map.h:17:38)'
if (__comp(*__m, __value_))
Но если я отброшу amp;
, std::lower_bound
работает правильно.
Почему?
Ответ №1:
Если вы посмотрите на требования к предикату в std::lower_bound
, вы увидите, что он должен выглядеть так
bool pred(const Type1 amp;a, const Type2 amp;b);
Таким образом, вы не можете использовать ссылку. Только с const
квалификатором (или передача ключа по значению).
Комментарии:
1. если я добавляю квалификатор const , даже тогда он не компилируется
auto iter = std::lower_bound(map_.begin(), map_.end(), key, [](const autoamp; p1, const std::stringamp; rhs) { return p1.first < rhs; });
, но если я не используюauto
его, он компилируетсяauto iter = std::lower_bound(map_.begin(), map_.end(), key, [](const std::pair<std::string, std::string>amp; p1, const std::stringamp; rhs) { return p1.first < rhs; });
2. Какой компилятор и версия?
3. @KhouriGiordano gcc версия 4.8.5 20150623
4. Не уверен, поддерживает ли эта версия автоматические лямбда-параметры, но я предполагаю, что она скомпилирована без ошибок. Если бы вы написали лямбда-выражение как автономную функцию, это был бы шаблон, принимающий T в качестве первого параметра.