Использование лямбда-выражения в троичном операторе C : несоответствие типа ошибки

#c 11 #lambda #conditional-operator

#c 11 #лямбда #условный оператор

Вопрос:

Я просто изучаю лямбда-выражение и пытаюсь использовать его для возврата из функции с использованием троичного оператора C . Однако приведенный ниже код не работает с ошибкой!

это упрощенная версия программы для объяснения моей реальной проблемы, поэтому, пожалуйста, отправьте ответ, используя только лямбда-выражение, а не просто return (x y offset).

В функции-члене ‘int Calculator::add(int, int)’: 12:26: ошибка: нет соответствия для троичного ‘operator?:’ (типы операндов ‘bool’, ‘int’ и ‘Calculator::add (int, int)::<lambda()>’) 16:3: предупреждение: управление достигает конца функции, не являющейся недействительной [-Wreturn-type]

     #include <iostream>
    #include <string>
    
    class Calculator
    {
      public:
      bool initalized = false;
      int offset = 0;
      
      int add(int x, int y)
      {
          return !initalized ? -1 : [this, x, y]()
          {
              return ((x y)   offset);
          };
      }
    };
    
    int main()
    {
        Calculator c;
        c.initalized = true;
        c.offset = 1;
    
        printf("%d", c.add(2,10));
    }

  

Что я здесь делаю не так?

Комментарии:

1. Вы должны вызвать лямбда-выражение -1, а лямбда-выражение не имеет общего типа

2. не могли бы вы, пожалуйста, показать мне фрагмент кода?

Ответ №1:

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

На самом деле вам нужно вызвать лямбда-выражение:

 return !initalized ? -1 : [this, x, y]()
      {
          return ((x y)   offset);
      }(); // <= added () 
  

Или без лямбда-выражения:

 return !initalized ? -1 : x y offset;
  

Ответ №2:

Что я здесь делаю не так?

Части true / false тернарного выражения несовместимы. Вы не можете преобразовать -1 в лямбда-выражение, и вы не можете преобразовать лямбда-выражение в int .

Мне не ясно, что вы пытаетесь сделать с лямбда-выражением, но это может быть:

 return !initalized ? -1 : (x   y   this->offset);
  

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

 return !initalized ? -1 : [this, x, y]() { return ((x y)   this->offset); }();
//                                                                 missing ^^
  

Комментарии:

1. Это понятно, я написал упрощенную программу для имитации реальной проблемы. Как кто-то может это сделать с помощью лямбда-функции — это мой вопрос!