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

Tre*_*key 13 c++ function auto return-type-deduction c++14

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

auto func();

int main() { func(); }

auto func() { return 0; }
Run Code Online (Sandbox Code Playgroud)

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

有没有办法使用此功能而无需在通话前指定定义?使用大型调用树时,重新排列函数变得复杂,以便在调用它们的所有位置之前看到它们的定义.当然,可以暂时进行评估,直到找到特定的函数定义,然后可以推导出auto.

Yak*_*ont 9

不,那里没有.

甚至忽略了实际问题(需要多次通过编译,通过相互递归的类型定义轻松制作不可判定的返回类型,在一切结算时难以隔离编译错误源等),以及设计问题(前向声明几乎无用) ,C++ 11的设计考虑了易于实现.使编写编译器变得更难的事情需要强有力的理由.

无数的限制auto意味着将它滑入现有的编译器非常容易:根据我的经验,它是最受支持的C++ 11功能之一.C++ 14放宽了许多限制,但并没有像你描述的那么多.每次放松都需要理由和信心,编译器编写者需要付出代价才能实现.

我现在甚至不想要这个功能,因为我喜欢我的功能的签名至少可以在我称之为可以推断的地方.


Pet*_*der 5

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


Die*_*ühl 5

相关论文是N3638auto ,它禁止在知道返回类型之前使用使用返回声明的函数。然而,该论文实际上指出,只要可以从函数体推导出返回类型,它也可以被调用!因此,带有返回值的函数auto实际上可以是递归的。