Юридические определения 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 может применяться.) Более поздние абзацы, однако, делают говорят об удержании из возвращаемого типа, хотя первый абзац требует конечного типа возврата (и, следовательно, делает вывод излишним).