为什么 for_each 通过 move 返回函数

2023-11-22

我正在阅读文档std::for_each here http://en.cppreference.com/w/cpp/algorithm/for_each并看到返回值是std::move(f)

为什么标准强制在返回值中移动输入参数?既然输入参数是按值传递的,那么默认情况下它不会被移动吗?


当您编译以下代码时,这会导致我进行一些后续操作

Something function(Something something) {
    return something;
} 
  1. return 语句是我的系统上具有最高优化级别的举动(-O3),为什么大多数编译器不忽略这个返回值?局部值被省略,但函数参数未被省略。

  2. 在这种情况下,C++17 是否强制执行省略?我读了该提案(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html)但我不完全理解哪些情况符合强制省略的条件。

我试过这个Apple LLVM version 8.0.0 (clang-800.0.42.1)在我的 Mac 及其他设备上g++ 5.4在 Ubuntu 16.04 上。


这是由于 C++11 移动语义规则的最新更改所致。最初的搬迁提案当按值函数参数出现在 return 子句中时,不会自动移动。然而,到了 C++11 进程后期,该语言功能被添加了。

在添加语言功能之前,for_each“被感动了”。当时对 return 语句的移动是必要的。但到 C++11 发布时,它变得不必要了,尽管它无害。

LWG 问题 2747针对 C++17 更正了此问题。

至于你的第一个后续问题,我不是编译器编写者,但我最好的猜测是:目前删除函数参数的返回是不合法的(我知道这么多),我猜测为什么它不合法不合法在于没有人弄清楚如何实施它,因此没有人有动力改变该标准以使其合法。

第二次跟进:不,C++17 在这种情况下不强制省略。在这种情况下,规则与 C++11 相同,除了从for_each不再指定。

从下面的评论来看:

为什么说省略函数参数的返回是不合法的?

我正在参考N4660,也就是C++17,但是C++98/03/11/14中也有类似的写法……备份,最近已经被保护了。看N4659相反(同样好):

15.8.3 复制/移动省略 [class.copy.elision]

  1. 当满足某些条件时,允许实现省略类对象的复制/移动构造,...

    • in a return在具有类返回类型的函数中声明,当表达是非易失性自动对象的名称(函数参数或由函数引入的变量除外)异常声明 of a handler(18.3)) 与函数返回类型具有相同的类型(忽略 cv 限定),可以通过将自动对象直接构造到函数调用的返回对象中来省略复制/移动操作

该语言明确不允许省略函数参数。

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

为什么 for_each 通过 move 返回函数 的相关文章

  • strtok() 和空字段

    我正在将一些 C 结构序列化为字符串 然后将其反序列化strtok 但不幸的是 strtok 不检测空字段 例如 1 2 4 有没有替代功能 在linux上有strsep http www mkssoftware com docs man3
  • fork 和 exec 之间的区别

    两者有什么区别fork and exec 指某东西的用途fork and exec它体现了 UNIX 的精神 它提供了一种非常简单的方法来启动新进程 The fork调用基本上复制了当前进程 在almost任何方式 并非所有内容都会被复制
  • 氧图。如何将轴旁边的值格式从 1000 更改为 1k

    我正在尝试更改轴旁边的值的格式 例如从 1000 更改为 1k 或 1000000 更改为 1M 这在 LinearAxis 中可能吗 这是我的代码 m Axes Add new LinearAxis Position AxisPositi
  • 子进程中的变量修改

    我正在研究科比和奥哈拉伦的作品Computer Systems A Programmer s Perspective 练习 8 16 要求程序的输出如下 我更改了它 因为他们使用了一个你可以在他们的网站上下载的头文件 include
  • 运行 C# exe 文件

    复制 为什么我的 NET 应用程序在从网络驱动器运行时会崩溃 https stackoverflow com questions 148879 why does my net application crash when run from
  • .NET Core 2 - 从启动中调用存储库方法[重复]

    这个问题在这里已经有答案了 我有以下存储库和类 public interface IValueService GetAll public class ValueService IValueService private DataContex
  • 析构函数、dispose 和 Finalize 方法之间的区别

    我正在研究垃圾收集器在 C 中的工作原理 我对使用感到困惑Destructor Dispose and Finalize方法 根据我的研究和理解 在我的类中拥有析构函数方法将告诉垃圾收集器以析构函数方法中提到的方式执行垃圾收集 该方法不能在
  • 如何使用 C# 调用 REST API?

    这是我到目前为止的代码 public class Class1 private const string URL https sub domain com objects json api key 123 private const str
  • 如何使用 DesignData 帮助开发 Metro 应用程序?

    我一直在 Windows Phone 应用程序中愉快地使用 DesignData 我希望使用它来帮助在 VS2012 Blend for VS 中的 Metro 风格应用程序中可视化设计 我已经尝试过希望显而易见的方法
  • 如何在C中递归地找到另一个字符串中的字符串位置?

    我们有一个任务来创建带有两个字符串参数的递归函数 原型应该是这样的 int instring char word char sentence 如果我们愿意调用函数 instring Word Another Word 它应该具有以下返回值
  • 如何设置cookie值?

    我正在执行以下操作来设置 cookie 值 HttpCookie mycookie new HttpCookie mycookie mycookie Value value1 Case sensitivity mycookie Expire
  • 谷歌基准迭代的意义是什么?

    我正在使用 Google Benchmark 来测量某些代码的执行时间 例如 我编写了以下代码来测量其执行时间性能 include
  • 从 TFS 下载工作项附件(文件已损坏)

    我正在尝试创建 C 代码 因此我可以自动从 Team Foundation Server 下载 BUGS 预定义查询的所有附件 该代码似乎工作得很好 但所有下载的文件都因意外原因而损坏 我无法查看它们 有人可以看一下代码并分享意见吗 非常感
  • C# 的 xml 序列化中是否有一个属性可以跳过空数组?

    C 的 xml 序列化中是否有一个属性可以跳过空数组 这将提高 xml 输出的可读性 好吧 你也许可以添加一个ShouldSerializeFoo method using System using System ComponentMode
  • 仅最后一个用户控件显示内容控件

    我有一个奇怪的问题 我创建了一个带有标签和画布的用户控件 画布引用资源 但画布仅显示在我的堆栈面板中的最后一个控件上 这是我的窗户
  • 将 .NET 类库(主要定义 CRUD 操作)公开为服务

    公开现有内容的最佳 有效和最快的方法是什么 类 图书馆 主要定义 CRUD 操作 作为service 周转基金服务 or WCF数据服务 以便它可以与银光 or Ajax 在那儿tools 代码生成器 RAD 工具 哪些可以支持这个 预先感
  • 在运行时将项目添加到 ToolStrip

    您好 我有一个带有 收藏夹 菜单的 ToolStripMenu 我想在运行时在 WinForms 应用程序中添加子项目 我有一个 datagridview 右键单击它会显示一个包含 添加到收藏夹 选项的上下文菜单 当该事件被触发时 我想使用
  • 致命:所有操作都需要OperationId。请为路径的“获取”操作添加它

    我正在使用 AutoRest 从 swagger json 生成 api 的客户端 输出是 AutoRest code generation utility cli version 3 0 6187 node v10 16 3 max me
  • 当前线程中的单例

    我的单身人士如下 public class CurrentSingleton private static CurrentSingleton uniqueInstance null private static object syncRoo
  • “while(true) { Thread.Sleep }”的原因是什么?

    我有时会遇到以下形式的代码 while true do something Thread Sleep 1000 我想知道这是否被认为是好的做法还是坏的做法以及是否有任何替代方案 通常我在服务的主函数中 找到 这样的代码 我最近在 Windo

随机推荐

  • Spring Boot OAuth 始终重定向到 HTTP (IBM Cloud CF + Spring Boot 2)

    在 IBM Cloud CF Java Buildpack 上使用 Spring Boot OAuth 2 https github com ericis oauth cf https issue 我已经尝试了以下的每种组合 With在此配
  • 如何解决 AZFD0005 Azure Function App 错误

    目前 Node Azure Function App 存在抛出错误的问题AZFD0005 节点应用程序在本地运行良好 Azure 的具体错误是 Microsoft Azure WebJobs Script ExternalStartupEx
  • 如何减少 numpy 数组的维数?

    我从一个mxnxp array A In 16 A Out 16 array 2 10000000e 01 3 70060693e 01 2 00000000e 01 2 15659121e 01 1 50000000e 01 1 3500
  • 如何从命令行将 EOF 发送到 Python sys.stdin? CTRL-D 不起作用

    我正在从 unix 上的命令行写入我的 Python 进程 我想发送 EOF 或以某种方式刷新标准输入缓冲区 以便 Python 可以读取我的输入 如果我按下 CTRL C 就会出现键盘错误 如果我按下 CTRL D 程序就会停止 如何刷新
  • 将 AngularJS 嵌套表单设置为已提交

    我有一个嵌套的 AngularJS 表单 如下所示
  • 如何在 Android 上将 UTC 日期转换为本地 GMT 时间

    我有这个日期字符串 2016 04 26T09 14 10 477Z这是在 UTC 时区 我想将其转换为用户本地时区 因此如果是 GMT 02 00 我想要一个值为2016 04 26T11 14 10 477Z 注意 9 更改为 11 到
  • 使用适用于 Android 的 Smack Api 发送和接收消息

    自过去四天以来 我一直在尝试使用自己的 XMPP 和 Smack OpenFire 发送和接收聊天消息 根据Smack的 readme txt 我设置了连接并登录了用户 连接和登录的代码是这样的 public static String T
  • Magento - 从优惠券代码获取规则

    我必须检索与优惠券代码关联的规则 以便在报价中显示该规则的折扣百分比 最简单的方法是直接根据报价金额进行计算 但我想直接检索规则 然后从中获取折扣百分比 这就是我尝试过的 rule Mage getModel salesrule coupo
  • 编写新 DialogPreference 类的简洁方法?

    我正在通过扩展在 Android 中编写一些自定义首选项对话框DialogPreference班级 但是 我有点担心所需的样板代码量 因为似乎有很多行为需要测试 例如 这个数字首选项对话框的示例相当典型 http svn jimblackl
  • Python 中一张图中的多个图

    我是 python 新手 正在尝试使用 matplotlib 在同一个图中绘制多条线 我的 Y 轴的值存储在字典中 我在以下代码中在 X 轴中制作相应的值 我的代码是这样的 for i in range len ID AxisY PlotP
  • 在webview中加载flv视频的问题

    我想要load网络视图中的 flv 视频 我已经得到了帮助这个链接 但问题是我无法在模拟器中查看视频 这是我的代码 package com FlvTester import java lang reflect InvocationTarge
  • 来自闪亮应用程序的写入权限

    这是对此的后续问题 write csv 许可闪亮服务器 R 我正在使用一个闪亮的应用程序来搜索和保存一些数据 我在获取文件夹权限时遇到问题 读完这篇文章后 https groups google com forum topic shiny
  • Hadoop MapReduce 读取文本文件

    我正在尝试编写一个 MapReduce 程序 它可以读取输入文件并将输出写入另一个文本文件 我计划为此使用 BufferedReader 类 但我真的不知道如何在 MapReduce 程序中使用它 我怎样才能为其编写代码片段 附 我对 Ha
  • Meteor.js:查找所有文档并以相反的自然顺序返回

    我正在尝试返回集合中的所有文档 以将其与模板中的 each 一起使用 我的代码如下所示 return Answers find sort natural 1 但文档按自然顺序返回 而不是反向 有谁知道为什么 我从 MongoDB 文档中获取
  • WinMerge:如何在比较中忽略特定单词?

    当我在 Windows 平台上使用 WinMerge 比较 2 个文件时 您知道如何忽略特定单词吗 我的意思是我想对 WinMerge 说 不要关心那串单词 房子 花园等 所以当比较这两行时 the house is at london t
  • 由于来自 localhost 的 CORS 问题,请求失败

    我在 SO 和不同的博客上看到了几十个问题 并用 答案 谈论这个问题 但都无济于事 我的本地计算机 Ubuntu 16 04 上有一个 React js 应用程序 在本地 我尝试通过运行来测试它npm start它会打开浏览器http 本地
  • 列出所有当前打开的文件句柄? [复制]

    这个问题在这里已经有答案了 可能的重复 检查Python中打开了哪些文件 Hello 是否可以获得所有当前打开的文件句柄的列表 我认为它们存储在环境中的某个位置 我对这个函数感兴趣 因为我想安全地处理出现致命错误时打开的任何文件 即关闭文件
  • 使用 Python 使用 IAM 角色连接到 Redshift

    我正在使用 sqlalchemy 和 psycopg2 将 python 连接到 redshift engine create engine postgresql user password hostname port database n
  • Slick,如何将查询映射到继承表模型?

    Slick 如何将查询映射到继承表模型 IE 我有表A B C A 是 父 表 B 和 C 是 子 表 我想知道的是我应该如何使用 slick 对此进行建模 以便 A 将是抽象的 B C 具体类型 并且查询 A 中的行将导致 B 或 C 对
  • 为什么 for_each 通过 move 返回函数

    我正在阅读文档std for each here http en cppreference com w cpp algorithm for each并看到返回值是std move f 为什么标准强制在返回值中移动输入参数 既然输入参数是按值