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

时间:2013-12-23 19:29:52

标签: c++ function auto c++14 return-type-deduction

尝试使用function return type deduction

auto func();

int main() { func(); }

auto func() { return 0; }

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

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

4 个答案:

答案 0 :(得分:8)

不,没有。

甚至忽略实际问题(需要多遍编译,通过相互递归的类型定义容易制作不可判定的返回类型,在一切结算时难以隔离编译错误的源代码等),以及设计问题(前向声明是C ++ 11的设计很容易实现。编写编译器更难的事情需要强有力的理由。

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

我现在甚至都不想要这个功能,因为我喜欢我的功能的签名,至少在我称之为可以推断的那些。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

相关论文是N3638,它禁止在知道返回类型之前使用以auto返回声明的函数。然而,本文实际上指出,一旦返回类型可以从函数体推断出来,它也可以被调用!因此,具有auto返回的函数实际上可以是递归的。

答案 3 :(得分:1)

我会尽量避免在函数中自动扣除返回类型。虽然它似乎是一个漂亮的功能,可以减少实际找出类型的需要,但它不是一个简单的功能,它有一些限制(返回类型不能用于SFINAE上下文,它需要实例化函数...)

您的问题的答案是编译器无法在不查看定义的情况下推断出类型,并且处理始终以自上而下的方式完成。