cbegin/cend 背后的原因是什么?

2024-01-04

我想知道为什么cbegin and cendC++11 中引入了?

在什么情况下调用这些方法会与 const 重载产生差异begin and end?


这很简单。假设我有一个向量:

std::vector<int> vec;

我用一些数据填充它。然后我想要一些迭代器。或许可以把它们传给大家。也许是为了std::for_each:

std::for_each(vec.begin(), vec.end(), SomeFunctor());

在 C++03 中,SomeFunctor能够自由地modify它得到的参数。当然,SomeFunctor可以通过值或通过const&,但是没有办法ensure确实如此。不是没有做这样的愚蠢的事情:

const std::vector<int> &vec_ref = vec;
std::for_each(vec_ref.begin(), vec_ref.end(), SomeFunctor());

现在,我们介​​绍一下cbegin/cend:

std::for_each(vec.cbegin(), vec.cend(), SomeFunctor());

现在,我们有句法保证SomeFunctor无法修改向量的元素(当然,没有 const 转换)。我们明确地得到const_iterators,因此SomeFunctor::operator()将被调用const int &。如果它的参数为int &,C++会发出编译器错误。


C++17 对于这个问题有一个更优雅的解决方案:std::as_const http://en.cppreference.com/w/cpp/utility/as_const。好吧,至少在使用基于范围时它很优雅for:

for(auto &item : std::as_const(vec))

这只是返回一个const&到它所提供的对象。

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

cbegin/cend 背后的原因是什么? 的相关文章

随机推荐

  • 使用 windows.h 在 Visual Studio 中进行串行通信

    我是 Visual Studio 的新手 我想从 LPC2148 套件传输和接收一些数据 为此我想在 Visual Studio 中进行串行通信 我在turboC中使用了dos h Bios h 也用于相同目的 但这些用于 Turbo C
  • 每个连接有多个事务的 MySQLdb

    是否可以对多个事务使用单个 MySQLdb 连接而不关闭它们之间的连接 换句话说 是这样的 conn MySQLdb connect host 1 2 3 4 port 1234 user root passwd x db test for
  • 对调用静态方法的类进行单元测试

    我正在尝试对调用类 B 的静态方法的类 A 进行单元测试 类 B 本质上有一个谷歌番石榴缓存 它从给定键的缓存中检索值 对象 或使用服务适配器将对象加载到缓存中 在缓存未命中的情况下 服务适配器类又具有其他自动装配的依赖项来检索对象 这些类
  • jQuery AJAX 跨域

    这里有两个页面 test php 和 testserver php test php
  • 使用opencv捕获单张图片

    我已经看到了有关使用 python 和 opencv 从网络摄像头流中捕获帧的一些内容 但是如何使用 python 和 opencv 以指定分辨率仅捕获一张图片 您可以使用以下命令捕获单个帧VideoCaptureOpenCV的方法 imp
  • 如何在 Github 中显示 D3.js HTML 图表

    我试图让d3 js图可以在github上显示 但是失败了 有没有办法解决这个问题 我已将 d3 html 图推送到 github 中 因为它没有渲染 所以我看不到绘图 你可以尝试使用GitHub 页面 https pages github
  • MySQl,连接/合并2个没有共享列的表并按公共列排序

    我有两个具有相同结构的表 处理不同的数据 我想合并它们 添加一个文本字段 指示该行的数据来自何处 并按公共字段排序 TABLE1 ID NAME YEAR 1 peter 2008 2 edward 2010 TABLE2 ID NAME
  • 山魈回复

    今天我注册了 Mandrill 帐户来了解它是如何工作的 这是我的 PHP 代码 https gist github com anonymous 5ca4c6fe388c465d8076发送一封简单的电子邮件
  • F# FSI,更改工作目录

    我在桌面的 新文件夹 中有以下文件 File location C Users my user name Desktop New folder AddOne fs module internal AddOneModule let AddOn
  • 按周/月/等分组 & ActiveRecord?

    我正在我的产品中进行一些静态计算 用户执行了许多操作 比如说发布了评论 我希望能够向他们展示过去一个月或过去一年每月发布的评论数量 activerecord 有没有办法以这种方式分组 我最好只是手动执行此操作 根据我自己的标准迭代记录求和吗
  • 在不同项目中用作编译的 jar 时,Spring AOP 不起作用

    我有一个工作AOP 当在项目内部使用时它被写入 但是当我构建这个项目 maven安装 并在另一个项目中使用该JAR时 并尝试使用 TimedLog注释 什么也没有发生 我尝试在其中断点 但它没有到达那里 它看起来像这样 Retention
  • 将多个 .exe 打包在单个 .msi 包中

    我试图将多个 exe 放入单个 msi 包中 并且应该一一安装 假设我有 a exe b exe 和 c exe 单击 msi 包时 应安装 a exe 并且 msi 应在成功安装 a exe 后等待它 它应触发 b exe 成功安装 b
  • Shinydashboardplus:如何添加没有标题的框?

    最近更新后ShinydasboardPlus 到2 0 我无法做到box没有标题 也没有标题空间 I tried title NULL headerBorder FALSE and still have this space How to
  • Neo4j 快速匹配模糊文本属性的方法

    我有合理数量的节点 大约 60 000 个 Document title A title 给定一个标题 我想找到匹配的节点 如果存在 问题是我给的标题不一致 也就是说 有时新单词的开头是大写 有时则是全部小写 有时关键字与 Kebab 大小
  • 我是否需要为线程之间的更改通知标志设置内存屏障?

    我需要一个非常快速的 在 读取器成本低 的意义上 而不是 低延迟 线程之间的更改通知机制 以便更新读取缓存 情况 Thread W 编写器 更新数据结构 S 在我的例子中是地图中的设置 只是偶尔一次 Thread R Reader 维护一个
  • devtools::check() 在 devtools::test() 通过的地方失败,因为并非 test 中的所有测试文件都复制到 [r] 上

    我的第一篇 r 帖子 我接手了一个由软件公司开发的项目 该项目由 4 个 R 包组成 在运行测试时 我发现虽然 devtools test 为其中一个包生成了干净的运行 但 devtools check 却没有 输出中的错误如下 gt te
  • 布局管理器boundingRectForGlyphRange:inTextContainer:不适用于所有字符串

    我有一个 UILabel 其中包含类似推文的字符串 其中包括其他用户的提及 Hey stephen and frank and Jason1 我试图让每个提及都是可点击的 这样我就可以加载该用户的个人资料 我从另一个 SO 帖子中找到了一些
  • PYTHONPATH 如何填充 sys.path 是否可靠并有记录?

    在我的机器上 这些值来自PYTHONPATH似乎被插入sys path 从索引 1 开始 订单保留 去重 例如 与PYTHONPATH spam eggs spam然后办理登机手续python m site 我得到如下结果 sys path
  • 如何删除 React Native 中的警告

    我正在开发一个应用程序并且正在使用bottomTabNavigator但与此同时我收到了这个警告 Look like you re passing an inline function for Component prop for the
  • cbegin/cend 背后的原因是什么?

    我想知道为什么cbegin and cendC 11 中引入了 在什么情况下调用这些方法会与 const 重载产生差异begin and end 这很简单 假设我有一个向量 std vector