экспериментируя с вычет типа возврата функции
auto func();
int main() { func(); }
auto func() { return 0; }
ошибка: использование «auto func ()» перед удержанием «auto»
Есть ли способ использовать эту функцию без необходимости указывать определение перед вызовом? С большим деревом вызовов становится сложно переставить функции так, чтобы их определение было видно перед всеми местами их вызова. Конечно, оценка может быть отложена до тех пор, пока не будет найдено определенное определение функции, а затем можно будет вывести auto.
Нет, нет
Даже игнорирование практических проблем (требующих многопроходной компиляции, простоты создания неразрешимых типов возвращаемых значений с помощью взаимно рекурсивных определений типов, трудности с выделением источника ошибок компиляции, когда все разрешается и т. Д.), А также проблем проектирования (такое прямое объявление почти бесполезно) , C ++ 11 был разработан с учетом простоты реализации. Вещи, которые затрудняли написание компилятора, требовали серьезного обоснования.
Множество ограничений на auto
Я имею в виду, что это было действительно легко вставить в существующие компиляторы: это одна из наиболее поддерживаемых функций C ++ 11 в моем опыте. C ++ 14 ослабляет многие ограничения, но далеко не так далеко, как вы описываете. Каждое ослабление требует оправдания и уверенности в том, что авторам компиляторов это будет стоить затрат на реализацию.
Я бы даже не хотел, чтобы эта функция в это время, так как мне нравится, чтобы сигнатуры моих функций были выводимыми в момент, когда я их называю, по крайней мере.
Нет, это просто невозможно с моделью компиляции C ++. Помните, что определение func
может появиться в другом файле или даже где-нибудь в библиотеке. Тип возвращаемого значения должен быть известен, если вы собираетесь его использовать.
Соответствующий документ N3638 который запрещает использование функций, объявленных с auto
вернуть до того, как узнать тип возвращаемого значения. Однако на самом деле в статье отмечается, что как только тип возвращаемого значения может быть выведен из тела функции, он также может быть вызван! Таким образом, функция с auto
возврат может быть рекурсивным.
Я бы избегал автоматического вывода типа возвращаемого значения в функциях настолько, насколько это возможно. Хотя это может показаться отлично функция, которая облегчает необходимость на самом деле выяснить тип, это не простая функция для использования, и она имеет ограничения (возвращаемый тип не может использоваться в контексте SFINAE, он требует создания экземпляра функции …)
Ответ на ваш вопрос заключается в том, что компилятор не может вывести тип, не видя определения, и обработка всегда выполняется в нисходящем порядке.