首页 > 后端开发 > C++ > 在C 11中使用'auto”时,如何确定变量是引用还是值?

在C 11中使用'auto”时,如何确定变量是引用还是值?

Susan Sarandon
发布: 2024-11-04 11:24:02
原创
1069 人浏览过

When using

C 11 “auto”类型推导:解析引用与值

在 C 11 中,“auto”关键字提供了一种便捷的方法自动推断变量的类型。但是,在使用“auto”时,必须了解确定其解析为值还是引用的规则。

“auto”的类型推导规则:

基本规则是“auto”解释变量本身的声明,而不是它代表的类型。因此,下面的示例清楚地表明“auto”解析为一个值:

<code class="cpp">auto i = v.begin(); // Copy, as begin() returns an iterator by value</code>
登录后复制

但是,在更复杂的场景中,区别可能不太明显。考虑以下示例:

  • 情况 1:引用还是复制?
<code class="cpp">const std::shared_ptr<Foo>&amp; get_foo();
auto p = get_foo(); // Copy or reference?</code>
登录后复制

在这种情况下,“auto”从以下推导出类型get_foo() 函数的返回类型,它是对 std::shared_ptr 的引用。由于 p 的声明使用单个与号 (&),因此它解析为 副本 ,而不是引用。

  • 情况 2:静态变量 - 复制或引用?
<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>
登录后复制

这里,“auto”从以下推导出类型s_foo 的声明,它是一个静态 std::shared_ptr。由于 sp 的声明中没有 & 符号,因此它再次解析为 copy.

  • 情况 3:循环容器 - 每次迭代都复制?
<code class="cpp">std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?</code>
登录后复制

在这种情况下,“auto”推导出type 来自向量的迭代器类型。迭代器返回 std::shared_ptr,它是引用类型。但是,由于 foo 的声明使用了与号 (&),因此它解析为 解引用 值,该值是 std::shared_ptr 副本

结论:

“auto”类型推导的规则很简单:它遵循变量本身的声明。要解析为引用,请在声明中使用 & 符号 (auto &ref = ...)。否则,“auto”将推导出值类型。

以上是在C 11中使用'auto”时,如何确定变量是引用还是值?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板