退货类型可以扣除吗?

时间:2014-05-20 12:37:20

标签: c++ c++11

考虑一个函数,不一定是templatised

T foo(Y bar);

其中TY是类型。

我可以使用decltype(bar)来获取bar的类型。所以我可以编写像

这样的代码

decltype(bar) anotherBar;

但是我有办法获得返回类型吗? decltype(return)会有语法意义。

3 个答案:

答案 0 :(得分:4)

在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尚未获得批准,但某些编译器可能已经实现了此功能,请查看编译器的文档。

答案 1 :(得分:3)

只需将函数本身的调用表达式用作decltype' s arg:

decltype(foo(bar))

答案 2 :(得分:2)

您可以使用std::result_of

Live example

#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 not 通常会提高可读性或代码&#34; kung-fu level&#34;。

请注意,回想起来,std::result_of会增加代码&#34;功夫等级&#34;甚至不仅仅是使用decltype。这不会使decltype用于此类事情。