66

На собеседовании задали вопрос - Что делает данный код?

int main(){[](){}();}
αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
Ivan43
  • 671
  • 5
  • 5

4 Answers4

72

Правильный ответ: ничего не делает.

А означает он следующее:

int main()  // Функция main без аргументов.
{
    []    // Объявление лямбда-функции без списка захвата...
    ()    // ... с пустым списком аргументов ...
    {}    // ... и пустым телом, ...
    ();   // ... которая тут же вызывается.
}
  • Вторые скобки означают вызов? – Ivan43 Dec 23 '15 at 08:13
  • @Ivan43 Да. Вторые круглые скобки означают вызов. –  Dec 23 '15 at 08:13
  • 2
    Да, это анонимная функция и вторые скобки означают ее вызов: http://stackoverflow.com/questions/12662688/parentheses-at-the-end-of-a-c11-lambda-expression – Pavel Parshin Dec 23 '15 at 08:13
22

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

Поэтому программа не имеет смысла.

  • Кстати, да. В наплюсованном ответе ничего не сказано про возвращаемое значение. "Может быть проигнорирован" - кем или чем? Компилятором? – Nick Volynkin Dec 23 '15 at 08:27
  • Смысл может быть хотя бы в проверке компилятора на c++11 – αλεχολυτ Dec 23 '15 at 08:32
  • @alexolut Я думаю, что для этого не требуется писать отдельную программу. – Vlad from Moscow Dec 23 '15 at 08:36
  • Способы могут быть разные. Просто утверждение про отсутствие смысла это скорее мнение, чем факт. – αλεχολυτ Dec 23 '15 at 08:39
  • @NickVolynkin § 3.6.1 Main function

    A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std::exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing return 0;

    – Monah Tuk Dec 23 '15 at 09:05
  • @NickVolynkin, т.е. 0 оно вернёт. – Monah Tuk Dec 23 '15 at 09:05
  • @MonahTuk речь о возвращаемом значении из лямбды, а не из main. Насчет генерации объектного кода тут вопрос, ибо без оптимизации код будет. Проверено на godbolt – αλεχολυτ Dec 23 '15 at 09:11
  • 1
    @NickVolynkin Лямбда не имеет возвращаемого значения (void), main в соответствии со стандартом при отсутствии return вернёт ноль. Компилятор может проигнорировать, т.е. "выкинуть" код, не имеющий эффекта. –  Dec 23 '15 at 09:15
  • @kff какой пункт Стандарта говорит об возможности выкидывания кода лямбды? – αλεχολυτ Dec 23 '15 at 09:18
  • 1
    @alexolut Объектный код не имеет никакого отношения к стандарту C. Главное - чтобы результат программы соответствовал результату, который был бы получен абстрактной машиной. – Vlad from Moscow Dec 23 '15 at 09:20
  • 1
    @VladfromMoscow вот я прошу сноску на Стандарт. – αλεχολυτ Dec 23 '15 at 09:21
  • @alexolut Какую сноску на стандарт? Стандарт говорит лишь о валидности конструкций языка C, а не о том, как компилятор может генерировать объектный код. – Vlad from Moscow Dec 23 '15 at 09:22
  • 4
    @alexolut Вот вам соответствующая цитата: "1.9 Program execution [intro.execution] 1 The semantic descriptions in this International Standard define a parameterized nondeterministic abstract machine. This International Standard places no requirement on the structure of conforming implementations. In particular, they need not copy or emulate the structure of the abstract machine. Rather, conforming implementations are required to emulate (only) the observable behavior of the abstract machine as explained below.5" – Vlad from Moscow Dec 23 '15 at 09:24
  • 1
    @VladfromMoscow спасибо. Более понятно, имхо, по сноске написано: an actual implementation need not evaluate part of an expression if it can deduce that its value is not used and that no side effects affecting the observable behavior of the program are produced. – αλεχολυτ Dec 23 '15 at 09:29
16

Как уже все ответили -- пустая лямбда.

А использоваться может в каком-нибудь configure, перед сборкой переносимого проекта для уточнения свойств системы при автоматической генерации, например, configure.h

avp
  • 46,098
  • 6
  • 48
  • 116
  • 2
    Кстати, это единственный ответ, который указывает на реально возможное практическое применение такого кода. – VladD Jan 08 '16 at 12:37
11

Судя по всему объявляет пустую лямбда-функцию и выполняет ее.

DreamChild
  • 36,244