Ошибка C2679: двоичный '<<': не найден оператор, принимающий правый операнд типа 'main::<lambda_1>' (или нет приемлемого преобразования)

Я учусь писать лямбда-выражение в cpp. Ниже приведен код с использованием окон Visual Studio 2022.

#include<iostream>
using namespace std;

int main()
{
  int k = 98;
  int l = 23;

  auto lm_add = [k,l](int i, int j) {
    return i + j;
    };

  cout << "addition using lambada : " << "cool" << lm_add << endl;

  return 0;

Хотел вернуть ответ для заданных переменных.

Лямбда захватывает k и l без причины. Вывод должен вызвать лямбду, lm_add(1,2).

Eljay 29.06.2024 14:39

Помните первую часть этого комментария: auto lm_add = [](int i, int j) { или вы хотели auto lm_add = [k,l]() { return k + l; } вызвать с << lm_add() <<?

drescherjm 29.06.2024 14:47
cout << ... << lm_add пытается напечатать сам лямбда-объект, что здесь не имеет смысла. Чтобы вызвать лямбду и распечатать результат, вам нужно использовать lm_add(...).
wohlstad 29.06.2024 14:55

Пожалуйста, уточните, для чего вам на самом деле нужна лямбда: получать 2 аргумента при каждом вызове (это должны быть i,j) или захватывать 2 значения один раз во время создания лямбды (k,l) и всегда возвращать их сумму?

wohlstad 29.06.2024 14:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Этот

auto lm_add = [k,l](int i, int j) {
    return i + j;
};

Инициализирует lm_add с помощью лямбда-выражения. За кулисами компилятор генерирует безымянный уникальный тип с оператором вызова с указанной сигнатурой, т.е. принимающим два целых числа, и с членами для захватов (также два целых числа). У этого типа нет оператора <<, который мог бы передать его в выходной поток. Его можно назвать:

std::cout << lm_add(k,l);

Однако он фиксирует k и l без уважительной причины. Возможно, вы хотите либо захватить переменные, чтобы можно было вызывать их без аргументов:

auto lm_add = [k,l]() {
    return k + l;
};

std::cout << lm_add();

Или не захватите их, передайте аргументы:

auto lm_add = [](int i,int j) {
    return i + j;
};

std::cout << lm_add(k,l);

Спасибо за подробное объяснение. Можете ли вы поделиться какими-либо ссылками, чтобы понять тему лямбда в cpp, заранее спасибо

P N Singh 29.06.2024 16:38

Вот хорошая ссылка с примерами: https://en.cppreference.com/w/cpp/language/lambda

drescherjm 29.06.2024 18:17

Другие вопросы по теме