LINUX.ORG.RU

СИ++ Лямбда функции. Как указать необходимый тип возвращаемого значения?

 , , ,


1

1

имеется необходимость использования лямбда функции в выражении оператора «if». Однако, вписывая туда:

 if ([&a, &b, &c](){
            for (auto el : a)
            {
                if (b == el || c == el)
                {
                    return true;
                }
            }
            return false;
    } || c == b)
        {
            return ЗНАЧЕНИЕ;
        }

компилятор грит, что нельзя привести возвращаемое значение лямбды к типу «bool».

стоит флаг компиляции -std=c++17

п.с. если убрать передачу внешних переменных то данная ошибка вроде пропадает, но тада как же мне их туда передать? теряется смсл использования.

★★

Последнее исправление: safocl (всего исправлений: 1)

Может круглых скобочек не хватает:

if ([&a, &b, &c](){
            for (auto el : a)
            {
                if (b == el || c == el)
                {
                    return true;
                }
            }
            return false;
    }() || c == b)
        {
            return ЗНАЧЕНИЕ;
        }

Есть ощущение, что C++ — это не ваше. Не мучайте ни себя, ни других.

eao197 ★★★★★
()

Зачем тебе тут лямбда, чтобы была? Посчитай флаг перед if’ом, получится простой и читабельный код за который тебя не нужно будет сразу уволить по профнепригодности.

А так-то, ты объявил свою лямбду, но забыл её вызвать. Ты наверное хотел

if ([&a, &b, &c](){ ... }() || ...) 
                         ^^
slovazap ★★★★★
()
Ответ на: комментарий от safocl

Ну тогда, возможно, лучше реально перед ифом флаг вычислить.

Ксати, если ты до сих пор не понял, почему оно компилировалось без захвата переменных - лямбда без захвата преобразуется к указателю на функцию, а так как указатель не нулевой, в ифе он всегда считается как true. Славься, сиплюсплюс.

Esper
()
Ответ на: комментарий от Esper

хмм... интересная инфа, спс. вроде понял.
практикуюсь примерно неделю.

я конечно просомтрел общие материалы по СИ++, однако в том плейлисте (канал simplecode на ютубе плейлист по основам в СИ++) я чтото значит пропустил ентот момент со скобками после реализации лямбды. Я думал она так будет вызываться сразу.
но так да, логично, функция же вызывается при указании круглых скобок после ее имени, а имя подразумевает указатель на область памяти где лежит ее реализация. Т.е. надо ставить круглые скобки после ее реализации в случае лямбды для вызова.

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 2)
Ответ на: комментарий от safocl

плейлисте (канал simplecode на ютубе плейлист по основам в СИ++

Это что, современная форма дислексии: изучать язык программирования по ютуб-каналам? Есть cppreference, есть cplusplus.com, есть примерно миллион туториалов и книг — нет, хотим видео. Видео, Карл!

XMs ★★★★★
()
Ответ на: комментарий от XMs

Это что, современная форма дислексии: изучать язык программирования по ютуб-каналам?

ДА!
Тебе за 30, и детей старше 6-ти нет, я угадал?
Иначе ты бы знал, что для поколения next основным поисковиком является youtube. Ну и социалочки. Да, я тоже был удивлен.

Kroz ★★★★★
()
Последнее исправление: Kroz (всего исправлений: 2)
Ответ на: комментарий от Kroz

Тебе за 30

Не за. Ровно.


и детей старше 6-ти нет, я угадал?

Да. Но у меня есть знакомые разных возрастов, в том числе и современные школьники. Там, конечно, много тупняка встречается, но такого, вроде, пока не видел

XMs ★★★★★
()
Ответ на: комментарий от deep-purple

В моём представлении это занятие по выходной пользе и нужности где-то в одном ряду с такими достойными видами деятельности как «дрочить вприсядку», засовывать в задний проход огурцы по методике доктора Попова и общаться через аудиосообщения в контакте

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 1)
Ответ на: комментарий от XMs

Но выше тебе правильно сказали, что поколение некст учится именно по видосам. И, походу, видосы в общей массе такие, что «мама дарагая». Так что ты своими правильными видосами можешь многих порченых говноконтентом про цпп ещё и на путь истинный поставить.

Тут, правда, возникает вопрос личной выгоды. Ведь времени на это будет уходить изрядно. Ну, по крайней мере для меня это очень важный момент.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Некоторый (!!!) материал и я бы по видосам изучал, например, связанный с обработкой звука, к слову.


ты своими правильными видосами можешь многих порченых говноконтентом про цпп ещё и на путь истинный поставить

Не-а. Будет, как в xkcd (с той разницей, что будут не стандарты, а курсы). К тому же, сомневаюсь, что я настолько педагог, чтобы грамотно излагать материал, не говоря уже про поставленную речь, чёткое произношение и прочее. То, что приемлемо в жизни, зачастую неприемлемо на записи, ты, думаю, это прекрасно понимаешь

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 1)

теперь я начинаю понимать, откуда берутся хейтеры с++ - были бы у меня такие коллеги, я бы тоже плюсы ненавидел

next_time ★★★★★
()
Ответ на: комментарий от eao197

Есть ощущение, что C++ — это не ваше. Не мучайте ни себя, ни других.

eao теперь не только IT-блоггер, но и сноб.

anonymous
()

Уважаемый студент (или школьник, в общем человек без опыта). Главная характеристика кода, которая актуальна всегда - понятность. Если код сложный для понимания - то легко допустить ошибку, которую ты и допустил. В данном месте лямбду хоть и можно применить, но не нужно, потому что ты и сам ошибешься и тот, кто будет читать этот код после тебя нихрена не поймет. Если очень хочется тут впихнуть лямбду, сделай перед if переменную с говорящим именем и присвой ей эту лямбду, а внутри условия if используй. Шансов ошибиться будет меньше, а компилятор за тебя все оптимизирует, так что накладных расходов при выполнении кода не останется.

P.S. Создание анонимной функции и ее выполнение - это какой-то JS-style.

anonymous
()

Тебе уже подсказали, что нужно выполнить временный объект, который ты получаешь после определения. Вероятно, ты практикуешь лямбды, поэтому используешь их неоправданно. Решить задачу чище можно было так:

if (b == c ||  
        find(begin(a), end(a), b) != end(a) ||
        find(begin(a), end(a), c) != end(a))

        std::cout << "OK\n";
Rot1
()
Ответ на: комментарий от XMs

ну cppreference я посещаю, там очень удобно конкретную инфу по конкретному моменту найти.
однако видео для меня является самым удобовоспринимаемым форматом для получения знаний, читать многа я не люблю, да и считаю енто не только у меня получается некоторая запутанность при прочтении большого количества инфы. А в ентих видосах все тематически разложено.

safocl ★★
() автор топика
Ответ на: комментарий от anonymous

мне не хочется, так будет необходимо в моем случае сделать.
однако, да, для ясности можно было и переменной присвоить значение лямбды и потом использовать уже в условии. Однако я подумал, что енто будет лишним.

safocl ★★
() автор топика
Ответ на: комментарий от Rot1

да, возможно так приятнее и читать и писать, только я пока что не дошел до алгоритмов, по ентому о find еще даже и во сне не слыхал, скора услышу, буду применять, спс

наверно так и перепишу.

safocl ★★
() автор топика
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от safocl

читать многа я не люблю
многа
енто
ентих

Оно и видно.


А в ентих видосах все тематически разложено

У того же Страуструпа тоже всё тематически разложено. А если зайти на CPlusPlus, то можно увидеть целую кучу разъясняющих самые основы статей, служащих туториалом

XMs ★★★★★
()
Ответ на: комментарий от deep-purple

Так есть же уже чувак. Но меня в нём раздражает то, что он в каждом видосе по 10 минут рассказывает, можно в виде текста усвоить максимум за минуту.

rupert ★★★★★
()
Ответ на: комментарий от rupert

ну так енто на англ языке, читать я еще как то могу, а вот речь распознавать как то савсем не очч

safocl ★★
() автор топика
Ответ на: комментарий от safocl

А знаешь почему? Потому что ты вот так всегда говришь и даже не пытаешься. Все сначала не умеют. Наоборот, вот так на практике эффективнее наворачивать, сначала непонятно, а потом сам заметишь прогресс.

anonymous
()
Ответ на: комментарий от anonymous

я уже начинал смотреть англ язык за 6 урокав...
посмотрел 1 видос и чот забил...
вуахахаха

safocl ★★
() автор топика
Ответ на: комментарий от safocl

И? Для программирования английский — must have

XMs ★★★★★
()
Ответ на: комментарий от safocl

С английским всё просто: все слова из С++.

rupert ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.