首页  >  文章  >  后端开发  >  C 11 中“auto”什么时候推导出值或引用?

C 11 中“auto”什么时候推导出值或引用?

Linda Hamilton
Linda Hamilton原创
2024-11-02 21:52:30440浏览

When Does

理解 C 11“auto”语义

在 C 11 中,“auto”关键字允许自动类型推导。然而,确定它是否解析为值或引用有时可能会不明确。

类型推导规则:

“auto”中的类型推导规则很简单:它基于对象的声明方式。

对于实例:

<code class="cpp">int i = 5;</code>

如果我们声明:

<code class="cpp">auto a1 = i;    // value
auto &a2 = i;  // reference</code>

a1将被推导为值类型(int),而a2将被推导为引用类型(int&)。

暧昧案例:

考虑以下示例:

<code class="cpp">const std::shared_ptr<Foo>& get_foo();
auto p = get_foo(); // Copy or reference?</code>

get_foo 返回一个引用,但 p 被声明为“auto”。在这种情况下,auto 会将 p 的类型推断为对 Foo 的引用。

<code class="cpp">static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?</code>

s_foo 是指向 Foo 的共享指针的静态实例。 sp 是使用“auto”声明的,因此它将被推导为 Foo 的共享指针。

<code class="cpp">std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?</code>

这里,“auto”将迭代向量,将 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&& >
{
    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

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn