Я не уверен, следует ли на этот вопрос ответить или закрыть с помощью универсального дубликата c относительно лямбда-синтаксиса, но здесь так много всего происходит, что я испытываю желание объяснить это шаг за шагом.
Прежде всего, я предлагаю получить хорошую книгу для изучения C ++ (особенно ту, которая охватывает C ++ 11), а не HackerRank или любой другой сайт "конкурентного программирования". Написанный там код редко можно назвать «хорошим», и решения, предоставляемые другими (как вы заметили), обычно просто сводят на нет их собственные знания, а не делятся ими с другими.
То, что вы видите, это один лямбда-выражение . Он определяет лямбду с именем compare
, которая принимает два const std::string&
в качестве аргументов и возвращает bool
. Скорее всего, позже он будет использован в функции из библиотеки <algorithm>
. Упрощенно, лямбда - это короткий синтаксис для функции, который можно вызвать позже где-нибудь еще.
Лямбда-синтаксис выглядит следующим образом:
[ capture-list ] ( parameters ) optional-qualifiers -> return-type { body }
Ваша лямбда имеет:
- пустой список захвата (он работает только с параметрами, указанными при каждом вызове)
- два аргумента типа
const std::string&
, которые передаются при каждом вызове лямбды. noexcept
Квалификатор - программист обещает, что эта лямбда - тип возвращаемого значения
bool
- тело отдельной строки
return now.size() == next.size() ? now < next : now.size() < next.size();
Относительно переменной compare
не выдаст исключений *, есть несколько ключевых слов, используемых для его определения:
static
сильно зависит от контекста - это означает что-то другое в области видимости класса и в пространстве имен. Подробнее в этом вопросе const
совершенно очевидно - эта переменная не изменится. Требуется для инициализации static
членов класса на месте. auto
- пусть компилятор выводит тип переменной. Лямбды не имеют общего имени для типа, поэтому auto
или std::function<>
- это только варианты, которые можно использовать.
Наконец:
Q3. Почему строка &? не строка
Почему бы и нет? Нет абсолютно никакой причины копировать аргументы в лямбду, поэтому намного быстрее передавать их по ссылке. Подробнее об этом topi c: В чем разница между передачей по ссылке и передачей по значению?