[英]Is return type deduction possible?
考虑一个不一定是模板的函数:
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);
}
请注意,即使标准允许这样做,声明中未明确指出类型的事实也会带来一些不良影响。 对于初学者,您不能在不提供定义的情况下声明该函数(返回类型是从主体中推导出的,没有主体,则声明将没有返回类型)。 此外,如果有多个return语句,这会带来问题[我在这里不记得确切的详细信息]
在使用模板函数的情况下,直到替换模板参数并实例化该函数( 在替换之后) ,才能知道返回表达式的类型,因此无法在SFINAE上下文中使用推导的返回类型。
尽管C ++ 14尚未获得批准,但是某些编译器可能已经实现了此功能,请查看编译器的文档。
只需将函数本身的调用表达式用作decltype
的arg:
decltype(foo(bar))
您可以使用std::result_of
。
现场示例 :
#include <type_traits>
constexpr void foo();
static_assert(std::is_same<void, decltype(foo())>::value, "");
static_assert(std::is_same<decltype(foo()), std::result_of<decltype(foo)&(/*argtypes*/)>::type>::value, "nope");
int main(){}
我不知道为什么在模板上下文之外使用decltype
。 它通常不会提高可读性或代码的“功夫水平”。
注意,回想起来, std::result_of
甚至不仅仅使用decltype
,还增加了代码的“功夫级别”。 这不能使decltype
用于这种事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.