自 C++14 起,尾随返回类型语法的合法使用

2023-12-30

实际上是否有任何理由再使用以下语法:

template<typename T>
auto access(T& t, int i)
  -> decltype(t[i])
{
    return t[i];
}

现在我们可以使用:

template<typename T>
decltype(auto) access(T& t, int i)
{
    return t[i];
}

尾随返回类型语法现在看起来有点多余?


推导的返回类型对 SFINAE 不友好。如果出现以下情况,该过载将简单地退出过载设置:t[i]是无效的:

template<typename T>
auto access(T& t, int i)
  -> decltype(t[i])
{
    return t[i];
}

而此重载则不会,从而导致硬错误:

template<typename T>
decltype(auto) access(T& t, int i)
{
    return t[i];
}

Demo https://godbolt.org/z/XuQX3c


此外,您可能会遇到推导的返回类型冲突的问题。考虑一下我是否想退货std::optional<T>。以下代码无法编译std::nullopt_t与以下类型不同std::optional<T>:

#include <optional> // C++17 standard library feature

template <typename T>
auto foo(T const& val)
{
    if (val.is_invalid()) return std::nullopt;
    return val.some_function_returning_an_optional();
}

尾随返回类型可让您准确指定要返回的表达式类型:

template <typename T>
auto foo(T const& val)
    -> decltype(val.some_function_returning_an_optional())
{
    if (val.is_invalid()) return std::nullopt;
    return val.some_function_returning_an_optional();
}

您可以使用前导返回类型,但这需要使用std::declval,这使得它更难理解:

template <typename T>
decltype(std::declval<T const&>().some_function_returning_an_optional())
foo(T const& val)
{
    if (val.is_invalid()) return std::nullopt;
    return val.some_function_returning_an_optional();
}

Demo https://godbolt.org/z/dRA1hH

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

自 C++14 起,尾随返回类型语法的合法使用 的相关文章

随机推荐

  • C++ 自动代码风格指南测试 [重复]

    这个问题在这里已经有答案了 可能的重复 是否有一个免费工具可以根据一组编码标准检查 C C 源代码 https stackoverflow com questions 93260 a free tool to check c c sourc
  • 如何解决“数据读取器中没有查询”错误?

    考虑以下代码 answer today AddDays 356 Dim command1 As New MySqlCommand Insert into UserScanner Username Password Address Conta
  • 新的 ggplot2 和自定义箱线图代码

    我一直在使用 Kohnke 代码的修改版本这个帖子 https stackoverflow com questions 3010403 jitter if multiple outliers in ggplot2 boxplot我为 out
  • 如何在php中获取重复的多维数组

    我有一个多维数组 Array 0 gt Array a gt 1 b gt 2 c gt 3 d gt 4 1 gt Array a gt 1 b gt 5 c gt 3 d gt 4 2 gt Array a gt 1 b gt 2 c
  • 从远程服务器获取 ios 应用程序的时间

    我想知道我的 iOS 应用程序如何从远程服务器 NTP 其他 获取日期时间 而不是使用本地 iPad 日期时间 并在 NSDate 上对其进行转换 Thanks https github com jbenet ios ntp https g
  • 如何在 R 中将整个数据框附加到 CSV

    我已经可以使用以下命令将一行附加到 CSVcat这使得这变得非常容易 cat my row 1 2 3 4 mydf csv sep n append TRUE 但是据我所知 您不能将 cat 与整个数据框 多列和行 一起使用 我这样做是因
  • 使用 mpi 将矩阵写入单个 txt 文件

    我有一个巨大的矩阵 我将它分成一些子矩阵 然后对其进行一些计算 在这些计算之后 我必须将该矩阵写入一个文件中以进行后处理 是否可以将结果写入单个文本文件 我该怎么做 例如我们有一个nxy 方向划分的 ny 矩阵 每个进程有一个 nx秩矩阵
  • 带有 R 的 Google Place

    我的目的是使用R来查询google api 我有一个地址和名称列表 属于商店 餐馆等 我需要为每个地址和名称存储 纬度 经度 业务类型 我的想法是使用 google place api 使用文本搜索请求来搜索address存储纬度和经度 h
  • 使用 k6 时如何向 influxdb 进行身份验证

    我使用 k6 作为负载测试工具 我想将数据写入 influxdb 一切正常 除了我不知道如何发送 influxdb 的用户凭据 Example k6 exe run out influxdb http localhost 8086 stre
  • 在c#中回滚

    我有 2 张桌子查询和详细信息 在 保存 按钮上单击 我已写入 fbsave fbsavedetails fbsave 将数据保存到查询表中并fbsavedetails 将数据保存在详细信息表中 现在 如果 fbsavedetails 中发
  • 在 SVN 中合并一系列修订与重新集成之间有什么区别?

    我已经阅读了一些关于合并一系列修订和重新集成之间的区别的文档和博客 但我没有得到一件事 如果我选择一种或其他方式从分支到主干的合并 合并有什么区别 为什么合并一系列修订在某些情况下不起作用 但重新集成成功地将分支合并到主干 一方面 SVN
  • 存储过程和 EF Code First

    我想使用存储过程从数据库中检索实体 我不关心跟踪更改 我只需要解决所有实体 包括相关实体 我必须使用 SqlCommand 吗 那么复杂的属性呢 它们也会被解决吗 您还有什么其他限制可以告诉我吗 Thanks 关于在 EF 中使用存储过程的
  • 将应用程序从一个 Admob 帐户转移到另一个帐户

    刚刚将我的 Android 应用程序转移到另一个 Google Play 开发者帐户 以便在巴基斯坦而不是美国获得付款 我还有 Admob 帐户 付款仅发送到美国 现在我想在巴基斯坦接收付款 因此我想将我的应用程序转移到另一个地址为巴基斯坦
  • 找出 python 中的类实例可以使用哪些函数?

    如何动态地找出类实例中定义了哪些函数 例如 class A object def methodA self intA 1 pass def methodB self strB pass a A 理想情况下 我想找出实例 a 有 method
  • 如何在Linux主机上运行Windows docker容器?

    我们可以在 Linux 主机上运行 Windows docker 容器吗 还可以从同一网络中的其他 Windows 计算机通过 RDP 访问 Linux 上托管的 Windows docker 容器吗 今天 这显然是可能的 我最近使用 QE
  • 如何向 GET 请求发送巨大的参数列表

    我的服务器中有一个 REST API 其中List操作 应使用 GET 方法实现 从客户端接收多个参数 当前页面 行数 用于执行快速搜索的文本 定义复杂搜索过滤器的对象 字段操作值 形式的规则集 由于这个用于过滤搜索的复杂对象 我需要将列表
  • Xamarin Forms.Xaml.XamlParseException

    我正在创建一个 xamarin 行为来验证电子邮件 ID 因此我创建了行为文件并尝试在 XAML 文件中将其本地化 但出现以下错误 Xamarin Forms Xaml XamlParseException 位置 12 10 类型 本地 在
  • WCF 教程出现错误 400(错误请求)?

    我昨晚开始使用 WCF 设置一个简单的客户端服务器 它允许我在会话开始时向客户端发送游戏信息 我按照微软关于 WCF 的教程并使用 VS2008 WcfSerivce 模板开始并添加了我的方法 然后 我将其提供的地址复制并粘贴到客户端项目中
  • c# 最后插入id

    我正在使用带有以下 sql 的存储过程 INSERT INTO dbTblUsers strUsername strPassword VALUES p1 p2 SELECT IDENTITY 并调用该过程 Insert new user n
  • 自 C++14 起,尾随返回类型语法的合法使用

    实际上是否有任何理由再使用以下语法 template