首頁  >  文章  >  後端開發  >  C 11 中的「auto」何時推導出數值或引用?

C 11 中的「auto」何時推導出數值或引用?

Linda Hamilton
Linda Hamilton原創
2024-11-03 15:35:02898瀏覽

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn