Как вывести auto перед вызовом функции?

при экспериментировании с функцией возврата типа вывода

auto func();

int main() { func(); }

auto func() { return 0; }

ошибка: использование функции auto func() перед выводом 'auto

Есть ли способ использовать эту функцию без указания определения перед вызовом? При большом дереве вызовов становится сложнее переупорядочивать функции, чтобы их определение просматривалось перед всеми местами, которые они вызывали. Разумеется, оценка может быть отложена до тех пор, пока не будет найдено определенное определение функции, и тогда можно будет вывести автоматически.

Ответ 1

Нет, нет.

Даже игнорирование практических проблем (требующих многопроходной компиляции, простоты создания неразрешимых типов возвращаемых данных с помощью взаимно-рекурсивных определений типов, сложности в изоляции источника ошибок компиляции при разрешении всего и т.д.) и проблем с дизайном (это почти бесполезно), С++ 11 был разработан с учетом простоты внедрения. Вещи, затрудняющие запись компилятора, нуждались в сильном оправдании.

Бесчисленные ограничения на auto означают, что было действительно легко сместить его в существующие компиляторы: это один из наиболее поддерживаемых возможностей С++ 11 в моем опыте. С++ 14 расслабляет многие ограничения, но не идет почти так далеко, как вы описываете. Каждое расслабление требует обоснования и уверенности в том, что это будет стоить разработчикам компилятора.

Я бы даже не хотел эту функцию в это время, так как мне нравится, когда подписи моих функций выводятся в той точке, которую я их называю, по крайней мере.

Ответ 2

Нет, это просто невозможно с моделью компиляции С++. Помните, что определение func может отображаться в другом файле или даже внутри библиотеки где-нибудь. Тип возврата должен быть известен, если вы собираетесь его использовать.

Ответ 3

Соответствующий документ N3638, который запрещает использование функций, объявленных с возвратом auto, до того, как будет известен тип возврата. Тем не менее, статья действительно указывает на то, что как только тип возврата может быть выведен из тела функции, он также может быть вызван! Таким образом, функция с возвратом auto может быть фактически рекурсивной.

Ответ 4

Я бы избегал автоматического вычитания возвращаемого типа в функции в максимально возможной степени. Хотя это может показаться приятной особенностью, которая облегчает необходимость фактического определения типа, это не простая функция для использования, и она имеет ограничения (тип возврата не может использоваться в контексте SFINAE, для этого требуется создание функция...)

Ответ на ваш вопрос заключается в том, что компилятор не может вывести тип, не видя определения, и обработка всегда выполняется по принципу сверху вниз.