繁体   English   中英

可以归还类型扣除吗?

[英]Is return type deduction possible?

考虑一个不一定是模板的函数:

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);
}

请注意,即使标准允许这样做,声明中未明确指出类型的事实也会带来一些不良影响。 对于初学者,您不能在不提供定义的情况下声明该函数(返回类型是从主体中推导出的,没有主体,则声明将没有返回类型)。 此外,如果有多个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM