首頁 > 後端開發 > C++ > C 11 中「auto」什麼時候推導出數值或引用?

C 11 中「auto」什麼時候推導出數值或引用?

Linda Hamilton
發布: 2024-11-02 21:52:30
原創
495 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板