首页 > 后端开发 > C++ > 正文

C 11 中的'auto”何时推导出值或引用?

Linda Hamilton
发布: 2024-11-03 15:35:02
原创
896 人浏览过

When does `auto` in C  11 deduce a value or a reference?

C 11“auto”语义的微妙之处

在 C 11 中,auto 关键字提供了一种便捷的方法来根据变量的初始值设定项自动推断变量的类型。但是,关于 auto 是否会解析为值或引用,需要考虑某些因素。

理解规则

规则很简单:它取决于变量的声明方式。

<code class="cpp">int i = 5;
auto a1 = i;    // value
auto &a2 = i;  // reference</code>
登录后复制

在第一种情况下,a1 是一个值,因为它没有声明为引用。在第二种情况下,a2 是一个引用,因为它被显式声明为 1。

澄清不确定性

让我们将此规则应用于您提供的示例:

  • auto p = get_foo();: get_foo() 返回对智能指针的引用。由于 p 是在没有引用的情况下声明的,因此它将是一个副本,从而产生引用类型对象。
  • auto sp = s_foo;:s_foo 是对智能指针的静态引用。当将其赋值给 sp 时,引用将被复制,从而得到引用类型对象。
  • for (auto foo: c): foo 将是向量中每个迭代器的副本因为它没有声明为引用。

使用模板元编程进行证明

以下代码使用模板元编程演示了此行为:

<code class="cpp">#include <typeinfo>
#include <iostream>

template< typename T >
struct A
{
    static void foo(){ std::cout << "value" << std::endl; }
};
template< typename T >
struct A< T&amp;>
{
    static void foo(){ std::cout << "reference" << std::endl; }
};

float& bar()
{
    static float t=5.5;
    return t;
}

int main()
{
    int i = 5;
    int &r = i;

    auto a1 = i;
    auto a2 = r;
    auto a3 = bar();

    A<decltype(i)>::foo();       // value
    A<decltype(r)>::foo();       // reference
    A<decltype(a1)>::foo();      // value
    A<decltype(a2)>::foo();      // value
    A<decltype(bar())>::foo();   // reference
    A<decltype(a3)>::foo();      // value
}</code>
登录后复制

输出:

value
reference
value
value
reference
value
登录后复制

这确认了 auto 的类型是由它的声明决定的,而不是由它的初始化器的类型决定的。

以上是C 11 中的'auto”何时推导出值或引用?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!