Почему лямбда-функция не работает в std ::lower_bound при использовании ссылок в ключевом типе?

#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 в качестве первого параметра.