为什么临时对象被销毁后不崩溃

2023-11-30

class C
{
public:
    int True(int i) const
    {
        return i+2;
    }
};


const C& F(const C& c)
{
    return c;
}

int main()
{ 
    const C& c = F(C());                             // Line 1
    cout << boolalpha << c.True(1) << endl;          // Line 2
}

问题> 为什么上面的代码可以正确打印值? 我假设变量c将引用无效的临时C当对象到达第 2 行时。

// 更新

我想更新这个OP来说明我担心这个问题的原因。

以下是 C++ 模板的代码片段:完整指南

// maximum of two values of any type 
template <typename T> 
inline T const& max (T const& a, T const& b) 
{ 
    return a < b ? b : a; 
} 

正如您所看到的,函数返回对传入参数的引用。 我只是想知道为什么不使用以下版本:

// maximum of two values of any type 
template <typename T> 
inline T max (T const& a, T const& b) 
{ 
    return a < b ? b : a; 
} 

C++11 标准第 12.2/4 段规定在某些情况下临时变量的生命周期确实可以延长到生成它们的完整表达式的末尾:

两个上下文其中临时变量在与完整表达式末尾不同的点被销毁。 [...]

第一个上下文不相关。然而,根据第 12.2/5 段:

第二个上下文是当引用绑定到临时对象时。引用绑定到的临时对象或作为引用绑定到的子对象的完整对象的临时对象在引用的生命周期内持续存在except:

— 构造函数构造函数初始化程序 (12.6.2) 中引用成员的临时绑定将持续存在,直到构造函数退出。

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

— 函数返回语句(6.6.3)中绑定到返回值的临时变量的生命周期不被延长;临时值在 return 语句中完整表达式的末尾被销毁。

— 与 new-initializer (5.3.4) 中引用的临时绑定持续存在,直到包含 new-initializer 的完整表达式完成为止。

在这里,临时搭建的C()与参数绑定c功能的F。因此,临时变量在包含函数调用的完整表达式末尾被销毁F(),返回的引用是dangling.

调用函数True()其原因未定义的行为.

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

为什么临时对象被销毁后不崩溃 的相关文章

随机推荐

  • 每行具有不同列数的 JTable

    我怎样才能让 JTable 只用一列来布局一些行 例如 A1 Section Title Row With long Text A2 B2 C2 D2 A3 B3 C3 D3 A4 B4 C4 D4 A5 Section Title Row
  • C 和汇编程序实际上编译成什么? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 所以我发现 C 程序实际上不会编译为普通的 二进制 我可能在这里犯了一些错误 在这种情况下我很抱歉 D 而是编译为一系列的东西 符号表 与操作系统相关的东西 但是 汇编程序是否
  • 更新项目时,Azure Redis 缓存中是否有任何锁定机制?

    我正在使用 Azure 搜索开发 Azure Redis 缓存 但找不到任何有关 Redis 缓存并发性的明确描述 情况如下 在覆盖现有缓存项时 是否可以同时读取该项 如果是的话 Redis 缓存如何管理这个 它会锁定该项目直到它可用 还是
  • Python - selenium webdriver - 无法切换到注册弹出窗口

    我是 python 2 7 和 selenium webdriver 的新手 我正在尝试注册http way2automation com way2auto jquery index php 到目前为止 我一直停留在切换到注册弹出窗口上 我
  • Javafx:更改 setOnAction 中的场景

    我正在构建一个具有多个场景的 JavaFX 应用程序 在 setOnAction 事件中更改场景时 我遇到变量范围问题 这是我的代码 Stage myStage public Scene logInScene all the buttons
  • 如何在 Picturebox 上获得滚动条

    I have PictureBox picture I use picture Size bmp Size picture Image bmp 假设有两个整数maxWidth and maxHeigth 我想添加垂直 水平滚动条pictur
  • 我们可以在 Scala 中进行条件导入吗?

    假设我有以下代码 package my class Foo class Bar extends Foo object Chooser val isFoo true 我导入Foo as import my Foo gt MyClass 我希望
  • UITableView 单元格的动态高度问题 (Swift)

    可变长度的文本数据被注入到表格视图单元格标签中 为了使每个单元格的高度大小合适 我已经实现了viewDidLoad self tableView estimatedRowHeight 88 0 self tableView rowHeigh
  • 通过两个属性就地对列表进行排序

    我有一个具有两个属性的类 名称和位置 我想按位置对此类的列表进行排序 并且具有相同位置的元素应按名称排序 我正在处理静态列表 所以我想就地工作 到目前为止 我设法按一个属性对列表进行排序 list Sort x y gt x Positio
  • 属性“fixed-rate”不允许出现在元素“int:poller”中

    我无法在 poller 标签下添加属性 fixed rate 给出 属性 fixed rate 不允许出现在元素 int poller 中 请参考下面的 xml 文件
  • 在实模式下跳转到远地址

    我遇到一种情况 我必须在实模式下跳转到远地址 我的段值在fs寄存器和偏移量gs寄存器 在跳转过程中我必须保持准确的寄存器内容 我想出了一个想法如下 mov bp fs shl ebp 16 mov bp gs jmp ebp 假设bp fs
  • 在 Google 地图中查找多个位置的中心

    我刚刚复制了这个代码question并应用了我的纬度和经度 然而 纬度和经度将是动态的 并且center地图的内容将根据地点的纬度和经度而变化 以下是另一个问题的代码
  • 如何将 Jersey REST API 转换为可执行 JAR?

    我正在使用 Jersey Maven 并且可以使用 Jetty Tomcat 或 J2EE Preview 可以嵌入吗 将 REST API 移植为独立 可执行 JAR 的最简单方法是什么 没有 Spring Boot 可以吗 按照以下步骤
  • 安装和卸载硬盘

    如何在 Java 编程语言中挂载和卸载硬盘驱动器 与平台无关 因此不使用运行时执行硬编码命令 答案是 是和否 您无法在 java 中挂载或卸载设备 因为每个操作系统都有自己的方法来执行此操作 但是 您可以提供使用适配器模式作为本机接口的ja
  • 为什么around_filter或after_filter中的redirect_to不起作用?

    如何使redirect to在这些过滤器中起作用 我正在努力改变 def start redirect to index end def end redirect to index end to around filter around d
  • 增强的 for 循环不适用于循环体内的 Scanner

    为什么认为行不通 它只打印零 然而 当我使用带有索引值 i 的普通 for 循环并在循环体内使用 a i 时 它会起作用 问题不在于打印循环 因为它不打印值 即使使用正常的 for 循环也是如此 import java util Scann
  • ASM 库计算出错误的堆栈大小

    我使用 ASM 库生成字节码 方法的 最大堆栈大小 将自动计算 在运行时 我发现这个值 最大堆栈大小 不正确 我的源代码是 ClassWriter cw new ClassWriter ClassWriter COMPUTE MAXS Me
  • 将枚举映射到类型

    我正在尝试使用映射类型在枚举上 export enum CurrencyType USD USD AUD AUD GBP GBP CAD CAD 实现这种类型 type Rates AUD number CAD number GBP num
  • Twisted:禁用 Twisted 框架类的日志记录

    我的基于 Twisted 的客户端循环发送 UDP 数据包 因此我使用 DatagramProtocol 类 这是来源 usr bin python coding utf 8 from twisted application service
  • 为什么临时对象被销毁后不崩溃

    class C public int True int i const return i 2 const C F const C c return c int main const C c F C Line 1 cout lt lt boo