考虑一个函数,不一定模板化:
T foo(Y bar);
其中 T
和 Y
是类型。
我可以使用decltype(bar)
来获取bar
的类型。所以我可以写这样的代码
decltype(bar) anotherBar;
但是有没有办法获取返回类型? decltype(return)
具有语法意义。
最佳答案
在 C++11 中,您可以使用尾随返回类型,例如:
auto foo(Y bar) -> decltype(some_expr(bar)) {
return some_expr(bar);
}
需要让它尾随只是因为表达式依赖于声明为参数的 bar
,并且在定义返回类型的地方不存在。
C++14 提供(或一旦批准)一种更简单的方法,编译器应在其中推断函数的类型:
auto foo(Y bar) {
return some_expr(bar);
}
请注意,即使标准允许这样做,但声明中未明确说明类型这一事实可能会产生一些不良影响。对于初学者,您不能在不提供定义的情况下声明该函数(返回类型是根据主体推导出来的,没有主体,声明将没有返回类型)。此外,如果有多个返回语句,这是有问题的[我不记得这里的确切细节]
在模板函数的情况下,在模板参数被替换和函数实例化之前,返回表达式的类型是未知的,这是在替换之后,因此推导的返回类型不能在 SFINAE 上下文中使用。
虽然 C++14 尚未获得批准,但某些编译器可能已经实现了此功能,请查看编译器的文档。
关于c++ - 返回类型推导是否可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23760057/