返回类型演绎是否可能

Is return type deduction possible?

本文关键字:是否 演绎 返回类型      更新时间:2023-10-16

考虑一个函数,不一定模板化:

T foo(Y bar);

其中TY为类型。

我可以用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尚未批准,但一些编译器可能已经实现了此功能,请查看编译器的文档

使用函数本身的调用表达式作为decltype的参数:

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就可以了