在调用函数之前,如何推导auto
How do I deduce auto before a function is called?
在试验函数返回类型推导时
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上下文中使用,它需要函数的实例化…)
你的问题的答案是,编译器在没有看到定义的情况下无法推断类型,并且处理总是以自上而下的方法进行的。
- 具有默认模板参数的多态类的模板推导失败
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用constexpr + auto作为返回和参数类型的奇怪类型推导
- C++/11 auto 关键字是在更有效时推导参数进行按引用传递,还是始终按值传递?
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 为什么在使用 auto&&it=--vec.end(),是 UB 时自动推导左值引用?
- 为什么在auto和template函数的情况下,类型都没有推导为"const"类型
- 使用 auto 推导的 lambda 中成员函数的模板
- 如何用'auto'单词推导出哪种类型的参数编写函数?
- 为什么从右值整数向量的元素中推导 decltype(auto) 的类型是 int&?
- 为什么"auto"在推导返回值时不能接受大括号的初始化列表?
- 为什么将Auto推导到INT而不是UINT16_T
- 在调用函数之前,如何推导auto
- auto关键字没有推导字符串的类型
- 将auto关键字替换为推导的类型(clang或VS2010)
- 如何从“auto”变量推导类型
- "auto"类型推导编译,而显式类型给出错误
- 自动推导在作为 Lambda 实现时不起作用。错误:扣除'auto'之前
- 使用'auto'类型推导 - 如何找出编译器推导出的类型?
- 为什么基类不会在同一"auto"声明中自动推导?