我们什么时候可以在 C++11 lambda 中省略返回类型?

2023-12-26

据我所知know http://en.cppreference.com/w/cpp/language/lambda,在标准 C++11 中(不是 C++14),当省略 lambda 的返回类型时,其返回类型推导为:

  1. 当 lambda 仅包含带有表达式的单个 return 语句时,返回表达式的类型,或者
  2. void在所有其他情况下。

现在考虑这段代码:

#include <iostream>

auto closure = [](int x)
{
    x++;
    return x;
};

int main()
{
    int y = closure(10);
    std::cout << y << std::endl;
}

这应该属于情况 2。但是代码编译起来就像 C++14 一样auto类型推导,在 g++4.9.2、g++5 和 clang++ 中,-pedantic -Wall -Wextra -std=c++11。这里发生了什么?我对标准的解释是否错误?


您的代码在没有任何警告的情况下被接受,因为原始 C++11 限制被认为是标准中的缺陷,它允许实现修复该行为。参见 CWGDR975 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#975, DR1048 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1048 and N3638 https://isocpp.org/files/papers/N3638.html.

975. 对 lambda 返回类型推导的限制

[作为 N3638 号文件的一部分,在 2013 年 4 月的会议上转为 DR 状态。]

似乎没有任何技术困难需要当前的限制,即仅当 lambda 主体由单个 return 语句组成时才能推导 lambda 的返回类型。特别是,如果多个 return 语句都返回相同的类型,则可以允许它们。

1048.自动推导和lambda返回类型推导。

...

2014 年 11 月会议记录:

CWG 同意文件中体现的变更N3638应该被认为是针对C++11的DR.

总之,DR975 建议修改 lambda 表达式的返回类型推导规则,以允许多个返回语句。

DR1048 发现使用占位符类型推导正常函数的返回类型的规则存在差异auto与 DR975 中提出的规则略有不同。具体来说,普通函数的返回类型推导将在所有情况下丢弃顶级 cv 限定符,而 lambda 表达式的返回类型推导将保留类类型的 cv 限定符。

N3638 解决了这个问题等。


我怀疑除了在实现上述 DR 之前找到附带 C++11 lambda 支持的编译器版本之外,是否有任何方法可以恢复到原始行为。

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

我们什么时候可以在 C++11 lambda 中省略返回类型? 的相关文章

  • 赋值运算符和复制构造函数有什么区别?

    我不明白C 中赋值构造函数和复制构造函数之间的区别 是这样的 class A public A cout lt lt A A lt lt endl The copy constructor A a b The assignment cons
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • 为什么 std::allocator 在 C++17 中丢失成员类型/函数?

    一边看着std 分配器 http en cppreference com w cpp memory allocator 我看到成员 value type pointer const pointer reference const refer
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • 事件日志写入错误

    很简单 我想向事件日志写入一些内容 protected override void OnStop TODO Add code here to perform any tear down necessary to stop your serv
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 如何确定母版页中正在显示哪个子页?

    我正在母版页上编写代码 我需要知道正在显示哪个子 内容 页面 我怎样才能以编程方式做到这一点 我用这个 string pageName this ContentPlaceHolder1 Page GetType FullName 它以 AS

随机推荐

  • 访问 C 中的命令行参数

    如果这是一个菜鸟问题 请原谅我 但我是 C 的初学者 只学习了一段时间 我尝试编写一个对两个数字求和的程序 作为应用程序的参数提供 代码是这样的 include
  • C 结构点运算符到底做什么(低级视角)?

    我有一个关于 C 中结构的问题 因此 当您创建结构时 您实际上是在定义内存块的框架 因此 当您创建结构体的实例时 您正在创建一个内存块 以便它能够保存一定数量的元素 但是 我对点运算符的作用有些困惑 如果我有一个struct Car并有一个
  • 我的代码循环次数超出了我的预期,我怀疑我的 getchar 语句有问题

    首先 我要提前感谢在座的各位 我非常期待在计算机科学领域取得进步 并随着我变得更加熟练而帮助他人 现在这是我的代码 include
  • Rstudio运行和源码的区别

    我正在使用 Rstudio 不确定选项 运行 和 源 有何不同 我尝试用谷歌搜索这些术语 但 来源 是一个非常常见的词 无法获得良好的搜索结果 Run and source具有细微不同的含义 据 RStudio 报道文档 https sup
  • ExtJS 组合框过滤器

    我有两个组合框 第一个用于选择region 第二个用于选择province 应显示在省份组合框中的值将基于区域组合框中选择的值 区域组合框代码 xtype combobox label Region ID margin 10 20 flex
  • 如何解决“都使用 XML 类型名称 X,使用 XML 属性为类型指定唯一的 XML 名称和/或命名空间”?

    我有以下枚举定义 namespace ItemTable public enum DisplayMode Tiles Default namespace EffectiveItemPermissionTable public enum Di
  • 如何在 matplotlib 中制作空白子图?

    我正在 matplotlib 中制作一组子图 例如 3 x 2 但我的数据集少于 6 个 如何将剩余的子图留空 安排如下 0 0 0 1 1 0 1 1 2 0 2 1 这可能会持续几页 但在最后一页上 例如有 5 个数据集 2 1 框将为
  • IE 的 AWS 签名问题

    我目前正在将文件直接上传到 S3 用户应该能够将一个或多个文件拖到站点的定义部分 然后向我的服务器发出请求并为上传的文件生成签名 首先 我请求从服务器计算的有效签名 生成的签名如下所示 success action status
  • BackboneJs:在视图中 el: 和 tagName 之间有什么区别:

    我正在尝试理解这个概念 你能帮我简化一下这个问题吗 也许可以提供一个简单的例子来说明两者之间的区别el 属性和tagName 属性 在一些示例中 不同的视图使用el 有时和其他人使用tagName 我专门搞乱了我自己的实现example h
  • 当图像不存在时不显示下一个/图像组件

    我正在使用 next image 并且当图像的路径无效时 我希望图像根本不渲染 例如 该图像不存在 现在它显示小图标和替代名称 在这种情况下我不想显示任何东西 那可能吗 由于它是前端我无法使用fs检查 所以我不知道该怎么做
  • 在 Android 中使用 PhoneGap 选择图像/视频

    如何在 Android 中使用 PhoneGap 选择图像 视频 或拍摄照片 视频 我有一个网络表单需要选择图像 视频内容并提交表单来上传内容 PhoneGap有能力这样做吗 或者我必须回退到原生 Android 代码 是的 您可以使用ph
  • Xcode 未将最新资源文件复制到 iPhone

    我正在用 Xcode 用 Objective C 编写一个 iPhone 应用程序 并且有一些在设备上运行的 Lua 脚本 我遇到一个问题 如果我编辑 Lua 脚本 保存 切换到 Xcode 并构建并运行 Y 则该 Lua 脚本的最新版本会
  • OpenSSL 服务器密码选择

    在 SSL TLS 握手期间 客户端发送受支持的密码套件列表 服务器选择用于对话的密码套件 Windows 有一个密码套件的优先级列表 可通过注册表进行配置 并将选择该列表中客户端支持的第一个套件 使用密码套件标志创建可接受的密码列表后 O
  • 虚拟目录中的 IIS 配置文件

    我有多个网站 它们都具有相同的代码 但应用程序设置不同 我想将我的应用程序设置放在位于虚拟目录中的单独配置文件中 这将使我能够拥有跨所有站点共享的所有代码的单个副本 并且每个站点都有不同的虚拟目录 不幸的是 当我尝试配置它时 IIS 不会处
  • 用于高效日期解析的 FastDateFormat 的替代方案?

    非常了解性能和线程问题SimpleDateFormat 我决定去FastDateFormat 直到我意识到FastDateFormat仅用于格式化 不进行解析 有没有替代方案FastDateFormat 开箱即用 并且比SimpleDate
  • 获取拖动预览的帧

    我正在实施拖放UICollectionView使用 iOS 11 中引入的新 Apple API What I need is to get a frame of drag preview see below red rectangle 我
  • 我们何时应该在 Kotlin 上使用 run、let、apply、also 和 with 的示例

    我希望为每个函数 run let apply with 提供一个很好的示例 我读过了本文 https medium com tpolansk the difference between kotlins functions let appl
  • 确定点是否位于 3D 网格内部的算法

    用于确定点是否位于 3D 网格内部的快速算法是什么 为简单起见 您可以假设网格都是三角形并且没有孔 到目前为止我所知道的是 确定光线是否穿过网格的一种流行方法是计算光线 三角形相交的数量 它必须很快 因为我正在使用它进行触觉医学模拟 所以我
  • 有没有办法从 AppEngine Standard 访问 Google Cloud 元数据服务以进行运行时配置?

    我想访问元数据服务 https cloud google com compute docs storing retrieving metadata来自 App Engine 标准应用程序 我尝试执行 urlfetchhttp metadat
  • 我们什么时候可以在 C++11 lambda 中省略返回类型?

    据我所知know http en cppreference com w cpp language lambda 在标准 C 11 中 不是 C 14 当省略 lambda 的返回类型时 其返回类型推导为 当 lambda 仅包含带有表达式的