首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++模板自动返回类型与箭头符号需要解密类型?

C++模板自动返回类型与箭头符号需要解密类型?
EN

Stack Overflow用户
提问于 2018-07-31 17:52:51
回答 2查看 2.7K关注 0票数 6

C++11在函数中引入了返回类型的箭头符号(不知道名称):

代码语言:javascript
复制
template <typename T>
auto fun(T&& a) -> decltype(bar(a)){ ... }

但scott认为,使用auto作为返回类型本身将删除所有const和引用限定符(因为它遵循与模板演绎相同的模式),因此惯用的方法是执行decltype(auto),将所有限定符保持在类型的顶部。

但是,在这种情况下,auto是否被推断为decltype(bar(a))?那么decltype(auto)会是decltype(decltype(bar(a)))吗?这是多余的吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-31 17:58:23

当您有一个尾随返回类型时,auto关键字显示为一个符号元素。返回类型成为->之后的任何类型。不执行类型扣减。这只是编写带有尾部返回类型的函数声明的方式。只有在没有尾随返回类型时才会发生自动返回类型的扣减,即auto用作占位符返回类型,函数声明器的末尾没有-> …

票数 15
EN

Stack Overflow用户

发布于 2018-08-01 00:59:14

假设int& bar(); (或使用尾部返回类型语法auto bar() -> int&;),

您可以声明几个功能:

  • int& f1();auto f1() -> int&;.
  • decltype(bar()) f2();auto f2() -> decltype(bar());.(返回类型为int&)。decltype允许使用SFINAE作为模板函数。
  • decltype(auto) f3() { return bar(); }的定义需要(推导为int&) (无SFINAE)。
  • auto f4() { return bar(); }的定义需要(推导为int) (无SFINAE)。

decltype(expression)类型的,而decltype(type)是无效的,所以decltype(decltype(expression))也是无效的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51619314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档