Юридические определения main() в С++ 14
Последний черновик С++ 14, который я смог найти, говорит о main()
[3.6.1]:
Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Он должен иметь тип возвращаемого типа int, но в противном случае его тип определяется реализацией. Все реализации должны обеспечивать как
- функция(), возвращающая int и
- функция (int, указатель на указатель на char), возвращающая int
и (параграф 5)
Если элемент управления достигнет конца main без столкновения с оператором return, эффект заключается в выполнении
return 0;
Означает ли это, что все следующие юридические С++ 14 минимальные программы? Если нет, почему бы и нет?
-
auto main() -> int {}
-
auto main() { return 0; }
-
auto main() {}
Ответы
Ответ 1
-
Является юридическим, второе и второе - не по следующим причинам:
-
Тип возврата основной функции не может быть выведен, поскольку CWG 1669 был принят, и стандарт будет изменен как:
Реализация не должна предопределять основную функцию. Эта функция не должна быть перегружена. Он должен иметь объявленный возвращаемый тип типа int, но в противном случае его тип определяется реализацией.
Это пробилось в n4140. Подробнее об этом: http://wg21.cmeerw.net/cwg/issue1669
-
То же, что и выше
Ответ 2
Первое, вероятно, является законным. Остальные два, конечно, не
(§7.1.6.4/1): "Автотип-спецификатор означает, что тип
объявляемой переменной выводится из ее
инициализатор или что декларатор функции должен включать
тип возвращаемого типа возврата.
Я говорю, вероятно, для первого, потому что §3.6.1 на самом деле не ясно
в какой степени это определение должно совпадать. 100% текстовое совпадение
не требуется, даже если это то, что буквальная интерпретация
то, что он говорит, будет означать: в тексте тело main
данный как /* ... */
, что не очень полезно и, конечно же,
не требуется. Аналогичным образом, традиция также допускает любое название
для argc
и argv
и объявить argv
как char** argv
.
Нет никаких традиций об определении основного с возвратным возвратом
тип, однако. Я думаю, что то, что подразумевалось в п. 3.3.1, состоит в том, что
все определения main
, которые имеют одну и ту же подпись, будут
разрешено, но это не то, что говорят фактические слова.
Независимо от того, почему нужно такое обфускацию? C/С++ не
Паскаль, и что естественно на одном языке (например,
возвращаемые типы для функций) является обфускацией в другом.
EDIT:
Я только что загрузил более свежий проект (N3797), и кажется
как формулировка изменилась (и теперь противоречива).
первый абзац по-прежнему говорит в основном то же самое (но
включает дополнительную формулировку для лямбда): auto
заменяется "либо выводом из инициализатора, либо явным
спецификация с возвратно-возвращаемым типом ". (И, конечно,
fucntions не имеют инициализаторов, поэтому только
trailing-return-type может применяться.) Более поздние абзацы, однако, делают
говорят об удержании из возвращаемого типа, хотя
первый абзац требует конечного типа возврата (и, следовательно,
делает вывод излишним).