Непонятная конструкция [дубликат]

218
16 июня 2018, 16:00

На данный вопрос уже ответили:

  • Разьясните что это за странная конструкция и что она делает? 1 ответ

Пытаюсь разобрать чужой код, не понимаю что это за выражение :

precedence([value] {
        if (value == '*') {
            return 2;
        }
        else {
            return 1;
        }
    }()

ясно как оно работает, но что за система? Лямбда выражение? Какой стандарт?

Answer 1

Тут немножко не хватает - как минимум закрывающей скобки.

Часть (я переписал, чтоб не тягать многострочность)

[value] { return (value == '*') ? 2 : 1; }

представляет собой определение лямбда-выражения без передаваемых параметров, но захватывающего значение переменной value. Пара скобок () после него - вызов этого лямбда-выражения. Так что если добавить забытую закрывающую скобку, то получим

precedence( /* вызов лямбда-выражения */ );

Что это - вызов функции или часть объявления переменной - без контекста неясно. Кроме того, чтоб это работало - должна быть переменная value. Например, компилирующийся и работающий код мог бы иметь вид

int main(int argc, const char * argv[])
{
    char value = '*';
    int precedence([value] { return (value == '*') ? 2 : 1; }());
    cout << precedence << endl;
}
Answer 2

Создадим альтернативный вариант

class Alternate {
    const char val;
 public:
    Alternate(const char& n) : val(n){}
    int operator ()() const {  return (val == '*') ? 2 : 1; }
} ;

ну и в программе

int main()
{             
   char value = '*';
   Alternate function_2(value);
   // альтернативный вариант будет выглядеть так:
   int precedence_2(function_2());
   // чтобы не определить функтор, просто использовано лямбда выражение
   // Лямбда выражение это анонимная функция. Приведенный вами пример
   // можно  написать  в  более читабельном виде
   auto function = [value] { return (value == '*') ? 2 : 1; };
   // function можно вызвать также как и другие функции(со скобками) 
   int precedence(function());
   // у вас написано то же самое.   
   cout << precedence << endl << precedence_2;    
   return 0;
}
READ ALSO
Как исправить ошибку в с++ ?

Как исправить ошибку в с++ ?

В коде возникла ошибка как ее исправить?

210
Сброс буфера ввода (&ldquo;читает лишнюю [пустую] строку&rdquo;)

Сброс буфера ввода (“читает лишнюю [пустую] строку”)

После ввода числа (например, возраста) считываю строку (например, имя-фамилию), но получаю в результате лишнюю пустую строкуОткуда она берется...

218
Что такое оператор &ldquo;--&gt;&rdquo; в С++?

Что такое оператор “-->” в С++?

После прочтения Hidden Features и Dark Corners of С++/STL на complang

208
Получение arp таблицы

Получение arp таблицы

Как получить arp-таблицу текущего хоста или как найти mac-адрес по ip-адресу с помощью boostasio? Нужно что-то типа SendARP функции, только кроссплатформенной

178