临时变量的 C++ 生命周期 - 这安全吗?

2024-01-12

如果我正确理解临时对象生命周期的规则,那么这段代码应该是安全的,因为临时对象的生命周期stringstream in make_string()持续到完整表达式结束。我不是 100% 确信这里没有一个微妙的问题,但有人可以确认这种使用模式是否安全吗?它似乎在 clang 和gcc http://ideone.com/C0uMc3.

#include <iomanip>
#include <iostream>
#include <sstream>

using namespace std;

ostringstream& make_string_impl(ostringstream&& s) { return s; }

template<typename T, typename... Ts>
ostringstream& make_string_impl(ostringstream&& s, T&& t, Ts&&... ts) {
    s << t;
    return make_string_impl(std::move(s), std::forward<Ts>(ts)...);
}

template<typename... Ts>
string make_string(Ts&&... ts) {
    return make_string_impl(ostringstream{}, std::forward<Ts>(ts)...).str();
}

int main() {
    cout << make_string("Hello, ", 5, " World!", '\n', 10.0, "\n0x", hex, 15, "\n");
}

标准的相关部分位于§12.2:

12.2.3) 最后一步销毁临时对象 在评估完整表达式(1.9)时,(从词法上)包含它们被创建的点。

Except:

12.2.4) 在两种情况下,临时变量会在与完整表达式末尾不同的点被销毁。第一个上下文是调用默认构造来初始化数组的元素时。 ... [不适用]

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

  • ...

  • 函数调用 (5.2.2) 中对引用参数的临时绑定将持续存在,直到包含调用的完整表达式完成为止。

所以就这样吧。临时的stringstream{}绑定到函数调用中的引用,因此它会持续存在,直到表达式完成。这是安全的。

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

临时变量的 C++ 生命周期 - 这安全吗? 的相关文章

  • C - 计算文件中的单词、字符和行数。字符数

    我必须用 C 编写一段代码 输出给定文件中的字符数 行数和单词数 任务看起来很简单 但我现在真的不确定出了什么问题 所以 这是代码 include
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • 如何转发声明要在 unique_ptr 的标准容器中使用的类

    在智能指针的标准容器中使用它时 是否可以避免完整的类定义可见 例如 我无法编译以下内容 include
  • C语言实现延时函数

    我想使用空循环实现延迟函数 但是完成一次循环所需的时间取决于编译器和机器 我希望我的程序自行确定时间并将程序延迟指定的时间 谁能给我任何想法如何做到这一点 注意 有一个名为delay 的函数可以将系统暂停指定的毫秒 是否可以在不使用此功能的
  • 表达式访问者仅为某些 lambda 表达式调用 VisitParameter

    我希望能够使用嵌套扩展方法将 EF 中的实体投影到相应的视图模型 参见我之前的问题使用扩展方法在 EF 中投影单个实体 https stackoverflow com questions 39585427 projection of sin
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • 为什么 ObservableCollection 有两个集合构造函数?

    The 可观察集合 T https msdn microsoft com en us library ms668604类有两个构造函数 可以在其中传递项目集合 一个构造函数接受一个IEnumerable T 另一个List T 鉴于List
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • 我如何知道向量的实际最大大小? (不使用 std::vector::max_size)

    在在线课程中 我正在学习向量 在其中一个例子中 他们解释说 std vector max size 应该给我向量可以达到的最大大小 我决定测试一下 include
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • Web浏览器控件:如何捕获文档事件?

    我正在使用 WPF 的 WebBrowser 控件加载一个简单的网页 在这个页面上我有一个锚点或一个按钮 我想在我的应用程序后面的代码中 即在 C 中 捕获该按钮的单击事件 WebBrowser 控件是否有办法捕获加载页面元素上的单击事件
  • 使用 FromBase64Transform 解码 base64 文件流

    The example https msdn microsoft com en us library system security cryptography frombase64transform 28v vs 110 29 aspx从M
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS
  • 如何在 C 语言中获取输入中的空格

    我想从控制台获取字符数组 它还包含空格 我在 C 中知道的唯一方法是 scanf 但是一旦遇到空格 它就会停止接受输入 我该做什么 这就是我正在做的事情 char address 100 scanf s address 尝试使用 fgets
  • 链接到ntdll.lib并调用ntdll.dll内部的函数

    我最近正在对私有 API 进行一些研究 我尝试调用诸如NtOpenFile在 ntdll dll 中LoadLibrary and GetProcAddress在运行时 幸运的是 它成功了 今天早上我在电脑上进行了文件搜索 发现ntdll
  • 为什么我无法通过 lambda 捕获“this”指针?

    考虑以下代码 class A public void foo auto functor this A a this auto functor a The compiler won t accept this instead of a a g
  • 使用 DataGridViewCheckboxCell 真正禁用 DataGridView 中的复选框

    有谁知道如何使用 DataGridViewCheckboxCell 禁用 DataGridView 中的复选框 我可以将其设置为只读 并设置背景颜色 但我无法让复选框本身显示为禁用状态 有什么想法吗 Guess 你必须自己画 http so
  • 打印任何类型的数组和列表的通用方法[重复]

    这个问题在这里已经有答案了 每当我调试一段涉及整数 双精度 字符串等数组或列表的代码时 有时我更喜欢打印它们 我为此所做的是为不同类型编写重载的 printArray printList 方法 for e g 我可能有这 3 种方法来打印各
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • PHP 7.2 wamp 服务器上的 Magento

    我正在使用 WAMP 服务器 php 版本 7 2 在本地系统上配置现有的 magento 项目 在安装 magento 时出现错误 必须加载 PHP 扩展 mcrypt 问题是 php 7 2 不再支持 mycrypt 有人可以建议我如何
  • RabbitMQ 等待多个队列完成

    好的 这里是正在发生的事情的概述 M lt Message with unique id of 1234 Start Queue lt Exchange lt bind to multiple queues Q1 Q2 Q3 lt star
  • 使用 JSTL 的 c:foreach 将列表值从 servlet 打印到 JSP

    这是我想要发送列表中存在的值的 servlet public class SearchServlet extends HttpServlet private static final long serialVersionUID 1L pub
  • spring注解可以访问方法参数吗?

    考虑一个UrlValidator方法注释 在调用方法之前测试给定的 url 是否有效 Target ElementType METHOD Retention RetentionPolicy RUNTIME public interface
  • Python 多处理内存使用

    我写了一个程序 可以总结如下 def loadHugeData load it return data def processHugeData data res queue for item in data process it res q
  • 如何 pip 安装 Twisted 而不出现错误?

    我正在尝试使用 Pip 在 Windows 10 上安装 Twisted 我知道还有很多关于安装 Twisted 的其他问题 但没有一个与我的错误相符 当我跑步时pip install Twisted 我收到以下错误 ERROR Comma
  • 如何在 iPhone 应用程序上仅支持纵向模式

    我正在开发的 iPhone 应用程序遇到一个奇怪的问题 我希望我的应用程序支持ONLY肖像模式 但由于某种原因我无法做到这一点 设备和模拟器 为了仅支持纵向模式 我做了如下操作 在 Xcode 的 TARGET 摘要部分中 我仅选择了纵向
  • 为情节图形的每个方面添加痕迹

    我想在情节的各个方面添加痕迹 例如 我想向显示 15 小费的 tips 数据集散点图的每个每日方面添加一条参考线 然而 我下面的尝试仅将线添加到第一个方面 import plotly express as px import plotly
  • laravel Socialite 无法在实时服务器上运行,只能在本地计算机上运行

    我最近将我的应用程序移至实时服务器中 问题是 Laravel Socialite 停止工作 解释如下 我点击谷歌登录并选择电子邮件后 回调时会发生这种情况 InvalidStateException on Abstract php on l
  • 有哪些工具可用于编辑联机帮助页,即 GUI WYSIWYG 编辑器(任何平台)

    是否有任何像样的 GUI 图形用户界面 所见即所得 所见即所得 编辑器 在任何平台上 可用于创作 编辑手册页 一个可以导出为 troff 格式的应用程序也可以 Nroff编辑 http aaa sec com nroffedit 最初是为了
  • 刀片模板和单选按钮 - 在 foreach 循环中选择第一个

    我有以下 Blade 模板条目 它创建 作为表行的一部分 一列单选按钮 我只想选择生成的第一个无线电 并且我想通过 PHP 来执行此操作 没有 js post 页面加载 如何检查这是否是我的集合中的 第一个 条目 从而放置字符串checke
  • 结束 Swing 应用程序时出现 JavaFX 错误

    我有一个 Swing 应用程序 需要在其中显示内部生成的 HTML CSS 为了做到这一点 我已经适应了来自这个 StackOverflow 问题的代码 https stackoverflow com questions 13717769
  • 如何合并动物园对象列表

    我有一个动物园对象列表 我想合并它们 我已经确保它们的长度都相同 看来为了合并它们 我需要做类似的事情 merge my list 1 my list 2 但随着列表长度的增加 这很快就会变得很麻烦 有人对处理这个问题有建议吗 Use do
  • Android SpeechRecognizer设置识别引擎?

    我正在使用 SpeechRecognizer 将语音转换为文本 我使用的是三星 当我将语音识别器设置为 Samsungpowered by Vlingo 时遇到错误 在更改为 Google 后错误消失了 我想知道是否有任何方法可以以编程方式
  • Docker:导出镜像失败:创建镜像失败:获取层失败

    我收到以下错误 导出图像失败 创建图像失败 获取图层失败 sha256 xxxxxxxxxxxxx 层不存在 Dockerfile FROM openjdk 8 COPY lib usr src app BOOT INF lib COPY
  • 在 C# vsto Excel 中选择性粘贴

    我正在开发 C vsto Excel 应用程序 每当用户从另一个 Excel 工作表将某些内容粘贴到 Excel 模板中时 它还会将单元格格式与单元格数据一起粘贴到 Excel 模板中 我想避免这种情况 所以我用谷歌搜索 发现了术语 特殊粘
  • 将元素存储在内存中以防止过于频繁地更新 DOM?

    目前我有一个循环在每次迭代中更新 DOM 我知道这是一种不好的做法 您应该尽可能少地更新 DOM 以提高速度 所以我想知道如何编辑下面的内容 以便我可以将所有元素存储在一个元素或其他元素中 然后在循环结束后执行单个 DOM 添加 这是循环
  • 文本不会被 swift UI 包裹

    即使设置后 lineLimit nil 文本不会被换行 var body some View VStack alignment center Text SwiftUI is a modern way to declare user inte
  • 如何设置自定义单元格的角半径

    这是我的示例输出 其中下面的详细信息中有三个单元格 我为每个自定义单元格设置了角半径 但它无法正常工作 第一个单元格的角半径不起作用 第二个单元格的右上角和顶部左边正在工作 请说明为此做什么 void layoutSubviews supe
  • 临时变量的 C++ 生命周期 - 这安全吗?

    如果我正确理解临时对象生命周期的规则 那么这段代码应该是安全的 因为临时对象的生命周期stringstream in make string 持续到完整表达式结束 我不是 100 确信这里没有一个微妙的问题 但有人可以确认这种使用模式是否安