为什么“自动”和显式引用变量声明的行为不同?

2023-11-24

我有这样的事情:

class Bar;

class Foo()
{
 public:
   Foo() : bar(new Bar());
   Bar& GetBar() { return *bar.get(); }
 private:
   std::unique_ptr<Bar> bar;
};

void main()
{
   Foo foo;
   auto bar1 = foo.GetBar();
   auto bar2 = foo.GetBar(); //address of bar2 != address of bar1. why?

   Bar& bar3 = foo.GetBar();
   Bar& bar4 = foo.GetBar(); //address of bar3 == address of bar4.
}

看来“自动”变量是副本,因为我没有用相同的内存地址返回 Bars。 如果我将变量显式定义为 Bar 引用 (Bar&),那么一切都会按我的预期进行。

我是用VS2012编译的。这里发生了什么?


auto bar1 = …总是声明一个副本。auto &&bar1选择最接近的可能参考类型,这就是您想要的。

auto && is the 完美转发 idiom.

您还可以使用其他复合类型auto, 例如auto const & or auto *如果你想具体一点。

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

为什么“自动”和显式引用变量声明的行为不同? 的相关文章

随机推荐

  • Ipython 可以在命令提示符下运行,但不能在浏览器中运行

    我使用的是 Windows 8 64 位笔记本电脑 我的电脑上已经安装了 python 2 7 所以我使用 easy install 安装了 Ipython 我现在可以在 C Python27 Scripts 中看到 ipython 应用程
  • 在 For Of 循环中使用对象

    为什么不能在 for of 循环中使用对象 或者这是一个浏览器错误 这段代码在 Chrome 42 中不起作用 表示 undefined 不是一个函数 test first one for var item of test console
  • numpy的fft结果的幅度要乘以采样周期?

    我尝试用一 个例子来验证我对 Numpy 的 FFT 的理解 exp pi t 2 应该exp pi f 2 当没有对直接变换应用缩放时 但是 我发现要获得这个结果 我需要将 FFT 的结果乘以一个因子dt 这是我的函数上两个样本点之间的时
  • 使用 date_format 选择日期范围 MySQL

    我在使用 MySQL 选择日期范围时遇到问题 SELECT MvtDate date format MvtDate d m Y FROM immmvt WHERE date format MvtDate d m Y BETWEEN 01 0
  • 自定义to_yaml和domain_type

    我需要定义用于序列化 反序列化对象的自定义方法 我想做如下的事情 class Person def to yaml type example com 2010 11 30 Person end def to yaml string repr
  • 管理 IO 单子

    我正在学习一些 Haskell 请原谅新手错误 这个例程出错了 我对 do exister String gt Bool exister path do fileexist lt doesFileExist path direxist lt
  • 基于生成器的协程与原生协程

    我刚刚读过PEP0492谈论协程的新方法 但 PEP 未能让我理解基于生成器的协程和本机协程之间的区别 有人可以告诉我其中的区别 也许可以举例 吗 据我了解 他们使用不同的词 yield yield from 和 wait async yi
  • GBZ80:LD HL,(SP+e) 如何影响 H 和 C 标志?

    在 Gameboy Z80 上 究竟如何LD HL SP e 操作影响 H 和 C 标志吗 半进位 进位 参考 http www devrs com gb files opcodes html 我意识到这是一个老问题 但我不久前遇到了类似的
  • 依赖属性错误

    我正在学习依赖属性 我读了很多帖子和书籍 但仍然不清楚 下面的程序是我为了学习而写的 其中有些错误 请帮忙解决 我有疑问 自定义依赖属性元素的主要用途是用于更改通知 我找到了一个 IsDefaultProperty 代码Button在 WP
  • 设置asterisk agi功能处理的等待音

    我使用星号和正常的 PHP AGI 以下this链接问题是我的 PHP AGI 需要 5 秒才能执行 我只是想设置一些等待音 让用户等待 AGI 处 理完毕 在同一个链接上我发现了一些东西 设置音乐 启用 禁用保持音乐发生器 例如 默认设置
  • 无限滚动 Div 与 Ajax 加载内容?

    我想实现一种称为可滚动 div 的技术GWT 我正在尝试做的事情如下 如果用户在我的页面上 他只能看到视口 图像中的绿色框 该视口中的所有 DOM 元素在页面加载时对用户可见 在页面加载时加载页面后 所有不在视口上的 DOM 元素尚未加载
  • VS2010 - WinForms - DataGridView - 绑定到数据集

    我是 winforms 的新手 我在表控件中有一个 datagridview 我正在尝试绑定它来显示数据 DataSet dataSet new DataSet DataTable dataTable dataSet Tables Add
  • 如何使用 tkinter filedialog.askopenfilename 方法避免文件选择器中隐藏文件?

    我想允许用户从文件管理器中选择 CSV 文件 但它也显示了所有隐藏文件夹 这是非常不合适的 如何避免隐藏文件夹 def importCSV self self file filedialog askopenfilename initiald
  • SQL Server 中表变量可以拥有的最大记录数

    是否有任何约束来限制表变量中可以拥有的记录数量 如果是 表变量可以容纳的最大记录数是多少 我必须编写一个存储过程来处理大约 1000 条记录 我需要使用表变量或临时表吗 因此 MSDN 官方网站SQL Server 的最大容量规格表变量没有
  • 如何在 iOS 10 中安装自签名证书

    Apple 似乎在 iOS 10 中删除了信任自签名 SSL 证书的功能 我创建了自己的自签名证书 并拥有一个使用我的证书签名的本地 Web 服务器 我必须在 iOS 中安装我的证书才能在本地进行测试 因为我开发了一个需要信任我的证书的 i
  • 增强的 for 循环不适用于将值分配给数组(Java)[重复]

    这个问题在这里已经有答案了 我不明白为什么我不能使用增强的 for 循环为数组的元素赋值 例如 像这样使用 for 循环 int array new int 5 for int i 0 i lt 5 i array i 10 产生我想要的东
  • 用GD创建一张包含其他图像的图片

    我想用PHP用GD创建一张由不同的其他图片组成的图片 例如 我有 6 张 或更多 图片 我想创建一张包含这些不同图片的图片 困难在于我的最终图片必须具有固定的宽度和高度 304x179 因此如果不同的图片太大 则必须将其剪切 这是来自 Ic
  • 如何使用 Ruby 从 CSV 中删除行

    给定以下 CSV 文件 如何删除 foo 列中包含单词 true 的所有行 Date foo bar 2014 10 31 true derp 2014 10 31 false derp 我有一个可行的解决方案 但它需要创建一个辅助 CSV
  • MySQL Inner Join with LIMIT 到左表

    我有这个数据库查询 SELECT FROM metadata im INNER JOIN content ic ON im rev id ic rev id WHERE im id 00039 AND current revision 1
  • 为什么“自动”和显式引用变量声明的行为不同?

    我有这样的事情 class Bar class Foo public Foo bar new Bar Bar GetBar return bar get private std unique ptr