在调用函数之前,如何推导auto

How do I deduce auto before a function is called?

本文关键字:何推导 auto 调用 函数      更新时间:2023-10-16

在试验函数返回类型推导时

auto func();
int main() { func(); }
auto func() { return 0; }

错误:在扣除"auto"之前使用"auto func()">

有没有一种方法可以使用此功能,而无需在调用前指定定义?对于大型调用树,重新排列函数会变得复杂,以便在调用它们的所有位置之前看到它们的定义。当然,评估可以推迟,直到找到特定的函数定义,然后可以推导出auto。

不,没有。

即使忽略了实际问题(需要多次编译,通过相互递归的类型定义很容易生成不可确定的返回类型,当一切都解决时很难隔离编译错误的来源,等等)和设计问题(正向声明几乎没有用),C++11的设计也考虑到了实现的方便性。使编写编译器更加困难的事情需要强有力的理由。

auto的无数限制意味着将它滑入现有的编译器中非常容易:它是我经验中最受支持的C++11特性之一。C++14放宽了许多限制,但并没有达到你所描述的程度。每一次放松都需要有理由和信心,相信它值得编译器编写人员实现。

我现在甚至不希望这个特性,因为我希望函数的签名至少在我调用它们的时候是可以推导的。

不,这在C++的编译模型中是不可能的。请记住,func的定义可能出现在不同的文件中,甚至出现在某个库中。如果要使用返回类型,则必须知道返回类型。

相关论文是N3638,它禁止在知道返回类型之前使用用auto返回声明的函数。然而,这篇论文实际上提出了一个观点,即只要可以从函数体中推导出返回类型,它也可以被调用!因此,具有auto返回的函数实际上可以是递归的。

我会尽可能避免函数中返回类型的自动推导。虽然它看起来是一个nice功能,可以简化实际计算类型的需要,但它不是一个简单的功能,而且它有局限性(返回类型不能在SFINAE上下文中使用,它需要函数的实例化…)

你的问题的答案是,编译器在没有看到定义的情况下无法推断类型,并且处理总是以自上而下的方法进行的。