基于范围的 for 循环中 range-init 的生命周期是多少?

2023-12-15

在最新的 C++ 标准中,它意味着:

for (foo : bar)
    baz;

相当于:

{
    auto && r = bar;
    for ( auto it = r.begin(), end = r.end(); it != end; ++it )
    {
        foo = *it;
        baz;
    }
}

当上面的 bar 是一个返回集合的函数调用时,eg:

vector<string> boo();

ie

for (auto bo : boo())
    ...

该行不是变成:

auto&& r = boo();
...

所以临时返回值boo()在语句末尾被销毁auto&& r = boo(),然后 r 是循环入口处的悬挂引用。这个推理正确吗?如果没有,为什么不呢?


这个推理正确吗?如果没有,为什么不呢?

到目前为止它是正确的:

因此 boo() 的临时返回值在语句“auto&&r=boo()”末尾被销毁 [...]

将临时对象绑定到引用可将其生命周期延长为引用的生命周期。所以临时持续整个循环(这也是为什么有一组额外的{}围绕整个构造:正确限制该临时的生命周期)。

这是根据 C++ 标准 §12.2 的第 5 段:

第二个上下文是当引用绑定到临时对象时。这 引用绑定到的临时对象或作为引用的临时对象 引用绑定到的子对象的完整对象 在引用的生命周期内持续存在,但以下情况除外:

[此处不适用的各种例外情况]

这是一个有趣的属性,允许滥用 ranged-for 循环来处理非范围的事情:http://ideone.com/QAXNf

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

基于范围的 for 循环中 range-init 的生命周期是多少? 的相关文章

  • C# AES Rijndael - 检测无效密码

    我正在使用 Rijndael 加密程序中的一些敏感数据 当用户输入错误的密码时 大多数情况下CryptographicException抛出消息 填充无效且无法删除 然而 CryptStream 不会抛出密码错误的异常 而是返回错误解密的流
  • 使用来自本地对象的消息的 std::Exception

    以下代码是否可以安全地抛出带有自定义消息的异常 include
  • HttpResponseMessage 的内容为 JSON

    我有一个 ASP NET MVC WEB API 由于多种原因 由于没有授权而重定向 我不能只使用一个简单的对象并在我的控制器方法中返回它 因此我需要 HttpResponseMessage 类来允许我重定向 目前我正在这样做 var re
  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • ZedGraph 缩放和调整大小

    当我绘制图形 放大和缩小并重新绘制图形时 图形的位置不会改变 我想要做的是 每当重新绘制数据时 视图都会更改以查看所有图形数据 如果您在重绘之前放大或缩小 这似乎会被禁用 Thanks 设置属性 IsZoomOnMouseCenter对于控
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 错误 C2064:术语不计算为采用 1 个参数的函数

    class Student bool Graduate return m bGraduate class School vector
  • ObservableCollection 上的“Cascade”绑定,包含其他 ObservableCollection

    我有一个项目需要显示合同列表 Class Affaire 每个合约都有一个阶段列表 类别阶段 我使用绑定在 2 个不同的 ListView 中显示它们中的每一个 问题是当我从 ListView 中删除一个 Phase 时 显示 Phases
  • 在 C 中声明和初始化数组

    C 有没有办法先声明然后初始化数组 到目前为止 我一直在初始化一个这样的数组 int myArray SIZE 1 2 3 4 但我需要做这样的事情 int myArray SIZE myArray 1 2 3 4 在 C99 中 您可以使
  • 如何获取任意类型的默认值

    在 C 中我可以写这样的东西 class AnyThing
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • R:动态创建变量名

    我正在寻找使用 for 循环创建多个数据帧 然后将它们缝合在一起merge 我可以使用创建我的数据框assign paste blah 但是 在同一个 for 循环中 我需要删除每个数据帧的第一列 这是我的代码的相关部分 for j in
  • 为什么Boost在“程序选项”中使用全局函数覆盖来实现自定义验证器

    这个例子 http www boost org doc libs 1 55 0 doc html program options howto html idp163429032显示一个名为validate在全局范围内定义重载函数boost
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • Windows Phone HttpClient PostAsync 挂起且无响应

    我在拨打电话时遇到问题HttpClientWP 应用程序的 post 方法 PostAsync总是挂起并且不给出任何响应 当我从 WPF 应用程序中尝试时 相同的代码可以工作 这是我正在做的事情 服务器Web API代码 public cl
  • 如何在 C# 中通过 JavaScript 回调运行 QUnit 测试并获取测试结果?

    在我的几个项目中 我使用 MVC 模式将代码 关注点 分为 3 层 模型层和控制层都在 C 上运行 因此我使用 MSTest 或 NUnit 等测试框架来验证这些层的功能需求 对于视图层 我使用 QUnit 来测试 JavaScript 文
  • 一个对大文件有效的轻量级 XML 解析器?

    我需要解析潜在的巨大 XML 文件 所以我猜这排除了 DOM 解析器 是否有任何优秀的 C 轻量级 SAX 解析器 在占用空间上可与 TinyXML 相媲美 XML的结构非常简单 不需要诸如命名空间和DTD之类的高级东西 只是元素 属性和
  • 将函数作为函数参数传递

    Unity C 似乎无法识别Func lt gt 作为函数委托的符号 那么 如何将函数作为函数参数传递呢 我有一个想法Invoke functionName 0 可能有帮助 但我不确定它是否实际上立即调用该函数 或者等待帧结束 还有别的办法
  • 在 C++ 中将大型数据向量写入/读取到二进制文件

    我有一个 C 程序 它通过将 ascii 文件中的网格人口数据读取到大型 8640x3432 元素双精度向量中来计算给定半径内的人口 将 ascii 数据读入向量大约需要 30 秒 循环每列和每行 而程序的其余部分只需要几秒钟 我被要求通过
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On

随机推荐

  • “cscript //NoLogo”代表什么?

    这是一个java程序代码 运行记事本程序并粘贴存储在该程序本身中的特定文本 我想知道你能否向我解释一下String vbs值 以及File file 以及 cscript NoLogo file getPath in the Process
  • 只检索更改的文档字段

    我发现监听文档变化会总是一遍又一遍地下载完整的文档 在以下情况下我遇到问题 文档的大小正在接近1 MiB 这是文档大小的限制 现在 有一个number场即仅字段更新 这只是几个字节 但是 收听此更改 例如对帖子的点赞 将始终下载完整的1 M
  • Firefox 在伪元素周围添加了奇怪的空间

    看看这些照片 JSFiddle链接在底部 firefox chrome 它们都是从 chrome 和 Firefox 中获取的相同元素 正如您所看到的 来自 Firefox 的元素在其顶部和左侧周围有一些空间 但来自 chrome 的元素没
  • Dompdf 在 Laravel 中封装其他语言支持

    我在 laravel 项目中使用 dompdf 包创建了我的 pdf 但是当我想渲染其他语言 孟加拉 而不是英语时 显示 div style margin 50px padding 10px div align center h2 Anti
  • C 拆分 CMD 参数

    我正在尝试做某事 但我可以 我有一个 C 程序 我想在其中解析所有参数 让我们更具体一点 EDIT 我在缓冲区中读取命令 而不是在程序以 argv 等启动时读取命令 我使用 fgets 从 STDIN 读取命令 假设我读了这样的命令行 ls
  • 根据列表索引组合字典列表

    我觉得这个问题以前肯定有人问过 但在 Stack Overflow 上找不到 有没有一种方法可以根据列表索引优雅地组合多个字典列表 见下文 list 1 hello world foo test list 2 a b c d result
  • 将 JSON IPython 笔记本 (.ipynb) 转换为 .py 文件

    如何转换 IPython 笔记本文件 json 与 ipynb扩展 到常规 py module 从笔记本菜单中 您可以将文件直接保存为 python 脚本 转到菜单的 文件 选项 然后选择 下载为 您将看到 Python py 选项 另一种
  • javascript,当右div隐藏时左div必须是100%宽度

    FIXED 通过将 mplungjan 的代码编辑为以下内容来修复它 function foo on click function if this is checked checked a show fast function checke
  • 错误 1452 MySQL

    向空表中插入数据 但出现错误 1452 我不知道为什么 MySQL 在错误中提到了 NameInfo 表 CREATE TABLE NameInfo Language VARCHAR 7 NOT NULL Status VARCHAR 13
  • 如何指定涉及中间局部变量引用的闭包的生命周期界限?

    我正在尝试用 Rust 编写一个如下所示的函数 fn double and square lt a T gt x a T gt whatever the output type of t t is let t x x t t 我希望它适用于
  • Spring Boot 不允许 URL 中通过百分比和反斜杠

    我们收到一个 get 请求 该请求在 url 中发送字符串字符 因此我们使用路径变量来接收它们 显然 调用服务无法更改其调用后端的方法 因此我们需要能够接受包含以下未编码字符的 url 当发送百分号 时 将返回 http 400 如果 后面
  • 为什么我们将 Loggers 声明为 static Final?

    在 Java 中 为什么声明记录器是最佳实践static final private static final Logger S LOGGER private 这样其他班级就不能hijack你的记录器 static 因此每个类只有一个记录器
  • 如何用 C# 编写解析器? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 如何用 C 编写解析器 递归下降 现在我只想要一个简单的解析器来解析算术表达式 并读取变量 虽然后来我打算编写一个 xml 和 html 解析器 用于学习目的 我这样做是因为解析
  • 所有 BlackBerry 设备的 UI 兼容性

    我为 BlackBerry 编写了一个简单的应用程序 并使用 9630 模拟器进行了测试 如何获得与所有模拟器兼容的 UI 设计 测试 测试 测试 如果您需要您的应用程序在所有模拟器上运行 那么获取所有模拟器并尝试一下 轮缘做得很好为您提供
  • 在python中读取PFM格式

    我想读书PFM使用 Python 格式化图像 我尝试过imageio read但它抛出一个错误 请问我可以有什么建议吗 img imageio imread image pfm 以下 Python 3 实现将解码 pfm 文件 下载示例纪念
  • 无法将 create_async() 与 WRL WinRT 组件一起使用

    我想使用 WRL 编写一个支持异步的 WinRT 组件 但我发现create async 即使我包括了 也是未定义的ppltask h and using namespace concurrency如何使用WRL模式创建后台任务 我的功能是
  • 获取 Spark ML 多层感知器分类器的输出层神经元值

    我正在使用 Spark ML 多层感知器分类器进行二元分类 mlp MultilayerPerceptronClassifier labelCol evt featuresCol features layers inputneurons i
  • map(&:name) 在此 Ruby 代码中做了什么?

    为了更好地理解 Ruby 我在网上冲浪时遇到了以下代码 require rubygems require activeresource ActiveResource Base logger Logger new File dirname F
  • 如何更改 Android M 中拒绝/授予的权限?

    我怎样才能让用户有机会更改应用程序中的权限 他已经设置了授予 拒绝 假设用户拒绝了权限 稍后他希望我们授予此许可 是否可以 我怎样才能做到这一点 如果用户拒绝了该权限 您可以检查该权限 如果他也检查了不再显示 在这种情况下 您可以打开自己的
  • 基于范围的 for 循环中 range-init 的生命周期是多少?

    在最新的 C 标准中 它意味着 for foo bar baz 相当于 auto r bar for auto it r begin end r end it end it foo it baz 当上面的 bar 是一个返回集合的函数调用时