Может ли основная (или начальная) функция быть реализована как лямбда? - PullRequest
8 голосов
/ 21 октября 2011

Действительно ли это в соответствии с недавно обновленным стандартом?

auto main = [](int argc, char* argv[]) -> int
{
    return 0;
};

Мое лучшее предположение заключается в том, что это зависит от того, ДОЛЖНА ли функция main () быть функцией, или она может быть любым глобально ограниченным символом, который можно вызвать (с ()).

Ответы [ 3 ]

14 голосов
/ 21 октября 2011

Нет, main должен быть глобальной функцией и не может быть функциональным объектом или чем-то еще. См. ISO / IEC 14882: 2011 § 3.6.1 Основная функция.

Программа должна содержать глобальную функцию main, которая является назначенным началом программы.

А из пункта 2

Все реализации должны позволять оба следующих определения главная:

int main() { /* ... */ }

и

int main(int argc, char* argv[]) { /* ... */ }

Для реализаций не требуется разрешать любые другие определения.

7 голосов
/ 21 октября 2011

Нет, и вот почему:

[n3290: 3.6.1/1]: Программа должна содержать глобальную функцию под названием main , обозначающий начало программы. это зависит от реализации ли программа в автономной среде требуется для определения главной функции. [ Примечание: в отдельностоящей среда, запуск и завершение определяются реализацией; автозагрузка содержит выполнение конструкторов для объектов область пространства имен со статической продолжительностью хранения; прекращение содержит выполнение деструкторов для объектов со статической длительностью хранения. - Конечная заметка ]

Лямбды - это не функции, а функциональные объекты или функторы:

[n3290: 5.1.2/3]: Тип лямбда-выражения (который также тип объекта замыкания) является уникальным безымянным объединением тип класса - называется типом закрытия - свойства которого описаны ниже. [..]

1 голос
/ 21 октября 2011

main () должна быть функцией из-за того, как она вызывается из системных библиотек.Он является частью стандарта POSIX.1 и определяет способ работы связи C

Основная связь должна быть extern global, она не может быть встроенной или статической, поскольку она вызывается из libc и обычно изфункция называется _start.

Например, типичная реализация _start в glibc:

int _start() {
     __libc_init(argc, argv, __environ);
     exit(main(argc, argv, __environ));
}

Различные реализации libc будут делать это аналогичным образом.

В C ++ основная функция должнабыть объявленным в глобальной области видимости (то есть) :: main ();снова, потому что он вызывается из функции, подобной init, такой как _start для libc в * nix функции выше после выполнения ...

...