const 引用数据成员绑定到临时初始化构造函数中的引用

2023-12-12

考虑以下代码:

#include <iostream>

struct A {
    const char *name;

    A() : name("A") {
        std::cout << "A()\n";
    }

    virtual ~A() {
        std::cout << "~A()\n";
    }
};

class B {
    const A& a;
public:

    B() : a(A()) {
    };

    void print_data() const {
        std::cout << a.name << '\n';
    }

    ~B() {
        std::cout << "~B()\n";
    }
};

int main() {
    B b;
    b.print_data();
    return 0;
}

GCC 4.4 的输出是:

A() ~A() A ~B()

这对我来说看起来很奇怪。我本来期望 A 的临时实例的副本绑定到 B::a 或者该临时实例本身在 ~B() 期间被破坏。

基本上,我认为 B::a 在 b 的生命周期中始终是有效的引用。事实上 b.print_data() 显然可以工作并且编译器不会给出任何警告。

标准c++98/03对于这个问题是怎么说的呢?


持续的引用并不能延长课堂上临时人员的寿命。就是这样。他们只在Foo const& f = Foo(); where foo按值返回,但仅此而已。

§12.2 [class.temporary]

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

p5 第二个上下文是当引用绑定到临时对象时。引用所绑定的临时对象或临时对象(临时对象所绑定的子对象的完整对象)在引用的生命周期内持续存在,除非下面指定。构造函数构造函数初始化程序 (12.6.2) 中引用成员的临时绑定将持续存在,直到构造函数退出.

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

const 引用数据成员绑定到临时初始化构造函数中的引用 的相关文章

随机推荐

  • 使用data.table在每组数据之前插入一行

    这也许是个愚蠢的问题 但我想在每组数据之前插入一个角色 我在网上能找到的只是如何在每个组后插入一行 此外 插入的行将有一个代表每个 ID 的序列号 例如 我有一个像这样的数据表 df ID TIME VAR VALUE 101 07 02
  • 如何以一致的方式从左到右、从上到下对轮廓进行排序

    我正在研究一个从图像中提取矩形框并按顺序对这些矩形框进行排序的问题 我尝试过的代码是 import cv2 import matplotlib pyplot as plt Load image grayscale adaptive thre
  • 在 Angular 2 组件模板中嵌入小部件

    我的一个组件模板需要有一个小部件https www tradingview com widget 它们提供了我们可以嵌入的脚本标签 但由于 Angular 2 从组件模板中删除了脚本标签 因此嵌入这些类型的小部件应该是最好的 我相信你会做这
  • UWP 应用安装程序自动更新无法正常工作

    我正在尝试从远程源自动更新我的 UWP 应用程序 为此我关注了这两个博客处理 sideloaded uwp and desktop bridge apps 的自动更新 创建应用安装程序文件 vsMSDN 的 我在版本 1803 操作系统内部
  • 可可得到一周的第一天

    如何获取约会一周的第一天 这似乎更容易 因为 当一周从星期日开始时 我需要取回星期日日期 如果从星期一开始 我需要获取星期一的日期 输入日期是一周内的任何日期 我尝试了几种方法 但边缘情况使其变得困难 我做了一个函数 但它不能 100 工作
  • Android 实时 Google 地图位置跟踪

    我正在开发一款 Android 应用程序 玩家可以根据自己的位置在手机上实时战斗 在 Google 地图上 您可以通过一个小蓝点看到您所在的位置 面向的方向以及正在移动的位置 我的问题是 如何将类似的东西集成到我的应用程序中 以便当玩家移动
  • Python:如何使用 Python 访问 mp3 文件的元数据? [复制]

    这个问题在这里已经有答案了 假设我想看看艺术家的名字 或者添加BPM信息 我可以使用哪些 Python 工具来完成此任务 有一个模块叫Python ID3正是这样做的 如果您使用的是 Debian Ubuntu 机器 则其软件包名称为pyt
  • 如何在Spring Data中进行Mongo聚合查询?

    这是我第一次在 Java 中使用 Mongo 这个聚合查询遇到了一些问题 我可以在 Mongo for Spring 中执行一些简单的查询 Query我的存储库接口中的注释扩展了MongoRepository
  • Python:在模块和类之间共享全局变量

    我知道在 Python 中可以跨模块共享全局变量 然而 我想知道这在多大程度上是可能的以及为什么 例如 全局mod py x None mid access mod py from global mod import class delta
  • 来自带有构造函数参数的 lambda 的 RelayCommand

    如果在 XAML 文件中 我将一个 Button 绑定到以下类中的 Command 则单击该 Button 不会导致执行 DoIt class Thing public Thing Foo p1 Command new RelayComma
  • 在正则表达式 python 中使用变量

    值得离开的是 这是我学习 Python 的第二天 而且我对这门语言不是很专业 任何低水平且易于理解的建议将不胜感激 我想在 python 的正则表达式中使用变量 我读过这个问题如何在正则表达式中使用变量 没有任何运气的答案 Code imp
  • 如何对数字进行四舍五入

    我如何能够将这些数字四舍五入到小数点后两位 这些数字全部存储在由网络抓取工具输出的变量中 4 7532 4 7294 4 7056 4 6822857142857 4 65868 4 63522 4 6119866666667 4 5889
  • 修复 IE9 中的 jQuery 拆分器

    Update 这个问题是关于多窗格分割器除了 IE9 之外 它在所有浏览器中都运行良好 右窗格子项的宽度不会随着窗口大小的调整而相应调整 在我的应用程序的上下文中 我还必须使用 setTimeout 0 延迟将右窗格分割方法放在不同的 ja
  • 使用 python selenium chromedriver 从源中选择隐藏选项值

    我正在阅读 Docx 文件 这里是link 解析其中的一些文本 然后使用 python selenium 绑定和 chrome driver 我尝试单击源中的隐藏选项值 driver page source 我知道它无法选择 到目前为止 这
  • 帮助定义全局名称

    My Code def A a A print a return def B print a in B return 当 B 输入解释器时我得到 Traceback most recent call last File
  • RoR - 如何删除 Rails 4.1.1 版本?

    我是 RoR 新手 我尝试遵循 Micheal Hartl 的 Ruby on Rails 教程 在开始本教程之前 我已经提前设置了所有内容 并将 Rails 版本更新为 4 1 1 一切都运行良好 直到教程中我需要有最高 4 0 5 版本
  • Openmp 代码的推力当量

    我尝试在 open mp 中并行化的代码是蒙特卡罗 可归结为如下所示 int seed 0 std mt19937 rng seed double result 0 0 int N 1000 pragma omp parallel for
  • 如何将整数数组转换为树?

    这里有 100 个数字 每行 10 个 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
  • 如何更改 WooCommerce 中的帐单地址字段标签

    在我的设计中 我有非标准计费字段标签和标记 例如 城镇 城市 应为 省 我使用过WOO文档 并过滤woocommerce billing fields 它适用于类名 占位符 创建新字段 但我无法更改标签 out arr billing ci
  • const 引用数据成员绑定到临时初始化构造函数中的引用

    考虑以下代码 include