auto、decltype(auto) 和尾随返回类型

2024-06-19

之间有区别吗:

template <class T>
constexpr decltype(auto) f(T&& x) -> decltype(std::get<0>(std::forward<T>(x)))
{
    return std::get<0>(std::forward<T>(x));
}

and:

template <class T>
constexpr auto f(T&& x) -> decltype(std::get<0>(std::forward<T>(x)))
{
    return std::get<0>(std::forward<T>(x));
}

如果是这样,它是什么?我应该使用哪一个来实现完美转发?


尾随返回类型只能与auto

要点是decltype(auto) vs auto is to 区分返回类型是引用还是值 https://stackoverflow.com/questions/21369113/what-is-the-difference-between-auto-and-decltypeauto-when-returning-from-a-fun。但在你的情况下,返回类型已经明确定义为decltype(std::get<0>(std::forward<T>(x))),所以即使你使用它也会被完美转发auto.

In auto f() -> T,“auto”关键字只是一个用于填充类型位置的语法结构 https://stackoverflow.com/questions/12224325/what-is-the-meaning-of-auto-when-using-c-trailing-return-type。它没有其他目的。


事实上,在 C++17 中你cannot use a decltype(auto)与尾随返回类型一起。

C++14 措辞 (n3936 §7.1.6.4[dcl.spec.auto]/1):

The auto and decltype(auto) 类型说明符指定一个占位符类型,稍后将通过从初始值设定项推导或使用显式指定来替换尾随返回类型. The auto 类型说明符也用于表示 lambda 是通用 lambda。

C++17 措辞 (n4618 §7.1.7.4[dcl.spec.auto]/1):

The auto and decltype(auto) 类型说明符用于指定占位符类型,稍后将通过从初始值设定项推导来替换该占位符类型。这auto 类型说明符也用于引入具有尾随返回类型或者表示 lambda 是通用 lambda (5.1.5)。这auto 类型说明符也用于引入分解声明(8.5)。

This is DR 1852 http://open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1852, see 尾随返回类型中的占位符是否会覆盖初始占位符? https://stackoverflow.com/questions/24259947/does-a-placeholder-in-a-trailing-return-type-override-an-initial-placeholder.

实际上,虽然gcc接受decltype(auto) f() -> T (这是一个错误 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67012), but clang will reject它说

error: function with trailing return type must specify return type 'auto',
not 'decltype(auto)'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

auto、decltype(auto) 和尾随返回类型 的相关文章

随机推荐

  • Netstat不显示docker暴露的端口

    因为某些原因netstat没有列出 docker 暴露的端口 按照建议here https stackoverflow com questions 36454955 docker and netstat netstat is not sho
  • 按名称获取多个 pandas 列的索引

    我想获取选定的 pandas 数据框列的数字索引 对于一列来说 这非常简单 nonzero df columns values conditionA 但有多个元素 我有一些有用的东西 但很冗长和巨大 df pd DataFrame colu
  • tc netem 中的选项限制是什么意思和作用?

    我正在尝试使用命令模拟慢速网络链接tc I use netem模拟延迟和丢包 htb 模拟窄带宽 但我发现有一个限制选项netem 这个选项有什么作用 会影响最终的带宽吗 我用谷歌搜索并找到了一些东西http manpages ubuntu
  • 使用 statsmodels 忽略多重 OLS 回归中的缺失值

    我正在尝试使用 statsmodels 和 pandas 数据框运行多重 OLS 回归 不同行的不同列中缺少值 并且我不断收到错误消息 ValueError 数组不得包含 infs 或 NaN 我看到了这个问题 它很相似 但并没有完全回答我
  • 从 float 转换的 Ruby Time 对象不等于原始 Time 对象

    time Time now fvalue time to f return time Time at fvalue 有人可以解释为什么上面的表达式返回 false 吗 如何从 float 创建一个与原始时间变量匹配的新 Time 对象 Th
  • 将我的应用程序部署在 Tomcat 的根目录下

    我有我的应用程序的战争文件 我需要在根级别部署它 当前的网址是http localhost 8080 war name application name 您有几个选择 取出开箱即用的ROOT 从 tomcat 目录并将您的 war 文件重命
  • Spring Security 通过并发登录尝试将用户锁定

    我是安全新手 遇到了一个问题 该问题导致用户帐户被锁定 只有重新启动应用程序才能修复它 我有一个带有 spring security 4 0 2 RELEASE 应用程序的 spring boot 1 3 0 BUILD SNAPSHOT
  • 如何使用 Google 脚本将数据添加到 Google 表格中的特定行

    在我的 Google 表格中 我将索引放在名为 colorRow 的变量中 我只是想向工作表中的该行添加一些数据 但数据不断进入页面下方的其他行 我究竟做错了什么 var data Some more fields in data arra
  • Google Data Studio - 刷新嵌入式网站上的数据

    我已在 html 页面上嵌入了 data studio 报告 我在一段时间后刷新 iframe 但报告没有更新 嵌入页面上的报告只能通过访问数据工作室网站上的报告并单击 刷新数据 图标来更新 如何在不手动点击 Data Studio 网站上
  • 交替 div 使图像向左(偶数)或向右(奇数)

    我正在尝试更好地排列图像 而不仅仅是一列中的图像 请参阅附件中的示例 每篇文章的图像可以位于左侧和右侧 这是我的代码 HTML section class content list page section
  • 如何在不循环的情况下添加组ID?

    我有数据框 例如 productid ordernum p1 10 p2 20 p3 30 p4 5 p5 20 p6 8 我想添加另一列 称为 groupid 它将产品按顺序分组在一起 一旦 sum ordernum 达到 30 分配一个
  • Numba 环境变量未通过 .numba_config.yaml 设置[重复]

    这个问题在这里已经有答案了 可以为 numba 设置一些环境变量 如文档中指定的 https numba pydata org numba doc dev reference envvars html https numba pydata
  • 快速有效地计算已知特征值的特征向量

    我的问题的简短版本 计算矩阵特征向量的最佳方法是什么A 如果我们已经知道属于特征向量的特征值呢 更长的解释 我有一个很大的随机矩阵A由于它是随机的 因此具有非负左特征向量x 这样A Tx x 我正在寻找快速有效的方法来数值计算这个向量 最好
  • iPad 2 检测

    由于我没有 iPad 2 因此我需要知道调用 UIDevice currentDevice model 时它返回什么 我以为它只返回 iPad 但看来我错了 有人可以告诉我吗 Thanks 检查是否有带摄像头的 iPad BOOL isIP
  • Angular 4 在 @ViewChild 上使用 setter

    我有一个演示here https stackblitz com edit angular dgmnlf file app 2Fchild component ts 我正在尝试使用 ngIf 将元素添加到 DOM 后获取该元素的高度 我试图通
  • PHP PDO 使用 bindParam 第一个参数(不带冒号)[重复]

    这个问题在这里已经有答案了 请检查这个 user id int GET user id sql DELETE FROM users WHERE user id user id query db gt prepare sql query gt
  • 构造函数参数与方法参数? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这确实是一个非常简单的问题 我希望得到 情况决定 的答案 然而 我想知道人们对将参数传递给构造函数或方法有何想法 我将尝试为我的问题设置背景 p
  • 根据选择值显示/隐藏字段

    我试图根据我选择的字段之一的值显示和隐藏一些表单字段 我希望使用数组来保存每个选择值应该显示的内容和不应该显示的内容 以将我从大量的 switch 语句中拯救出来 但无法弄清楚如何做到这一点 我正在使用 PHP 和 jQuery 任何帮助都
  • ActionBar 下拉微调器项目默认为第一项

    我试图设置默认情况下需要在微调器中选择的项目的索引 但它始终默认为 0 第一项 actionBar setDisplayShowTitleEnabled false actionBar setNavigationMode ActionBar
  • auto、decltype(auto) 和尾随返回类型

    之间有区别吗 template