在基于范围的 for 循环中使用转发引用有什么优点?

2024-01-02

const auto&如果我想执行只读操作就足够了。然而,我却遇到了

for (auto&& e : v)  // v is non-const

最近几次。这让我想知道:

与其他方法相比,在某些模糊的极端情况下,使用转发引用是否可能会带来一些性能优势?auto& or const auto&?

(shared_ptr是隐秘角落案例的嫌疑人)


Update我在我最喜欢的地方找到了两个例子:

迭代基本类型时使用 const 引用有什么缺点吗? https://stackoverflow.com/a/13057846/341970
我可以使用基于范围的 for 循环轻松迭代地图的值吗? https://stackoverflow.com/a/13087074/341970

请集中精力回答这个问题:为什么我想在基于范围的 for 循环中使用 auto&& ?


我能看到的唯一优点是当序列迭代器返回代理引用时,您需要以非常量方式对该引用进行操作。例如考虑:

#include <vector>

int main()
{
    std::vector<bool> v(10);
    for (auto& e : v)
        e = true;
}

这不会编译,因为右值vector<bool>::reference从返回的iterator不会绑定到非常量左值引用。但这会起作用:

#include <vector>

int main()
{
    std::vector<bool> v(10);
    for (auto&& e : v)
        e = true;
}

话虽如此,除非您知道需要满足这样的用例,否则我不会以这种方式进行编码。 IE。我不会无缘无故地这样做,因为它does让人们想知道你在做什么。如果我真的这么做了,添加一个关于原因的评论也没什么坏处:

#include <vector>

int main()
{
    std::vector<bool> v(10);
    // using auto&& so that I can handle the rvalue reference
    //   returned for the vector<bool> case
    for (auto&& e : v)
        e = true;
}

Edit

我的最后一个案例确实应该是一个有意义的模板。如果您知道循环始终处理代理引用,那么auto也可以auto&&。但是当循环有时处理非代理引用有时处理代理引用时,我认为auto&&将成为首选解决方案。

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

在基于范围的 for 循环中使用转发引用有什么优点? 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • sqlite递归祖先查询

    我试图弄清楚如何对分层表使用递归查询 我需要获取给定记录的祖先 并且记录应按其在层次结构中的级别顺序排序 也就是说 第一条记录应该是顶级节点 下一条记录应该是子节点 然后是它的子节点 一直到正在查询的记录 考虑一个名为 食物 的表 其中包含
  • CSS vw 和 vh 但相对于父级而不是视口

    我正在尝试创建一个固定纵横比的框 调整大小以不溢出其父级 经典填充底部技巧 https stackoverflow com questions 1495407 maintain the aspect ratio of a div with
  • 显示字符串中不可打印的字符

    是否可以用十六进制值可视化 python 字符串中的不可打印字符 例如如果我有一个内部带有换行符的字符串 我想将其替换为 x0a 我知道有repr 这会给我 n 但我正在寻找十六进制版本 我不知道任何内置方法 但使用理解很容易做到 impo
  • 使用 AngularJS 将表单控件设置为焦点不变

    在我的表单中 我想在用户关注表单控件时将其设置为不受影响 以便隐藏在触摸字段且字段无效时显示的验证消息 我怎样才能做到这一点 我曾尝试编写指令但无法使其发挥作用 我可以在控制台中看到指令中的值从 true 更改为 false 但表单控件没有
  • 在 Xcode 6 beta 中使用尺寸类

    在 Xcode 6 Beta 1 中使用 Swift 从头开始 构建一个新项目 并查看 Storyboard 的文件检查器 有Use Size Classes below Use Auto Layout 这是这个的截图 1 什么是Use S
  • 某些 SMS 消息如何传输发件人姓名?

    我注意到我从公司收到的某些短信带有 发件人姓名 例如 就在今天 我收到了一条来自我以前从未使用过的号码 不是我的联系人 的短信 但发件人姓名显示为 Adobe 我也从其他公司得到这个 例如 Facebook Google 和银行 它与电子邮
  • 使用 jQuery Mobile 动态更改翻转切换的值

    我正在使用 jQuery Mobile 并将一些设置保存在 cookie 中 当设置页面重新加载时 我读取 cookie 以设置所有值 我在设置时遇到问题翻转拨动开关 http jquerymobile com demos 1 0a2 do
  • 使用GDB运行时致命错误消失

    我有一个程序 它在测试用例中产生致命错误 我可以通过读取致命错误的日志和堆栈跟踪来定位问题 原来是对空指针进行了读操作 但是当我尝试将 GDB 附加到它并在可疑代码周围设置断点时 无法观察到空指针 程序运行顺利 没有任何错误 这是一个单进程
  • HTML5 拖放上传

    有谁知道如何使用HTML5实现桌面拖放文件上传吗 我找到了以下参考资料 使用拖放选择文件 2017 08 https developer mozilla org en Using files from web applications Se
  • 为什么字符串的空间复杂度是 O(n) 而数字是 O(1)?

    我对辅助空间复杂性有点迷失 在我参加的讲座中 讲师指出字符串的空间复杂度为 O n 因为字符串的长度 n 会有所不同 但诸如数字 布尔值 未定义等原语具有恒定的空间复杂度 O 1 我很困惑 因为如果字符串的空间长度不同 那么数字也不一样吗
  • 如何管理开发和生产之间的 SQL 权限?

    我正在尝试建立一个顺利的部署过程 我们可以使用单个部署脚本部署到生产或开发 SQL 服务器 但我不知道如何最好地管理两个环境之间的用户和权限 例如 在开发中我们希望开发者团队拥有db owner数据库角色 在生产中 我们要么不希望访问 要么
  • Chrome 上的 D3 地图平移和缩放性能

    为了让事情变得更容易 这里有一个JSFiddle http jsfiddle net 3twag6Lx 我所拥有的 TRY 在 FireFox 版本 35 0 1 中平移地图 单击并按住地图上的任意位置 然后快速左右移动 平移运动应该快速且
  • 由于mac上的gcc不支持openmp,我该怎么做才能让它支持呢?

    起初 我在我的Mac上使用默认的gcc 但它不支持openmp 使用 gcc v 我得到 gcc 4 2 1 所以 我使用brew来安装gcc 完成后 使用 gcc v 没有任何变化 酿造给我提示 可能不支持openmp 使用 brew r
  • 如何创建带有预览的打印对话框以打印图像文件

    我有一个 mac cocoa 图像编辑应用程序 我想向我的应用程序添加打印图像功能 我基本上总是随身携带一个 jpg png 文件 每当用户进入 文件 gt 打印 菜单时 我想为用户提供一个带有打印选项 设置的对话框来打印此 jpg png
  • 删除电话号码中的括号、破折号和空格

    我的电话号码是 123 456 7890 我正在使用replaceAll去除方法 and 和字符串中的空格 我尝试以下 String phNo 123 456 7890 replaceAll s trim 但它不起作用 有什么解决办法吗 这
  • sed 在特定行号处内嵌替换特定列号值

    我有一个 5 列 csv 文件 空格分隔 如下所示 username1 20130310 enabled 20130310 enabled username2 20130310 enabled 20130321 disabled usern
  • Android浮动窗口隐藏状态栏辅助功能问题

    我正在开发 android 4 4 2 构建一个应用程序 该应用程序具有由辅助服务创建的系统覆盖 浮动窗口 Edit 我希望能够全局隐藏状态栏 在任何应用程序中 通过下面的代码实现 但是 当显示叠加层时 我停止从侦听器和软件 硬件后退按钮接
  • 有没有类似 Nokogiri 的东西可以解析 Ruby 代码?

    诺科切里太棒了 我可以做类似的事情 css bla 这将返回第一个匹配的元素 现在我们需要对 Ruby 源代码进行一些解析 查找类中的所有方法等 我们正在使用红宝石解析器 http parsetree rubyforge org ruby
  • D3js 制图:自动聚焦地理区域? (svg画布、缩放比例、坐标平移)

    我处理了 SRTM 栅格数据以生成 shapefiles gt geojson gt topojson 因此我可以为 D3js 提供合适的格式 The result look like this the blue area is my ov
  • 在基于范围的 for 循环中使用转发引用有什么优点?

    const auto 如果我想执行只读操作就足够了 然而 我却遇到了 for auto e v v is non const 最近几次 这让我想知道 与其他方法相比 在某些模糊的极端情况下 使用转发引用是否可能会带来一些性能优势 auto