簡體   English   中英

在C ++ 11中使用auto

[英]Usage of auto in C++11

當我使用auto來推斷指針類型時,我發現了一個奇怪的現象。 我的代碼是這樣的:

#include <iostream>
using namespace std;
int main()
{
    int i = 100;
    auto p1 = &i;
    auto *p2 = &i;

    cout << *p1 << " " << *p2 << endl;

    return 0;
}

在編譯和執行之后,我們可以發現*p1*p2的結果是相同的,都是100.這意味着p1p2都是指向int對象的指針對象。

[user@host ~]$ ./test 
100 100

這兩個定義p1p2語句之間有什么區別嗎?

不同之處在於,在第一種情況下,auto被推導為int*而在第二種情況下,auto被推導為int ,這導致p1p2都是int*類型。 auto的類型推導機制等同於模板參數的類型推導機制。 因此,您的示例中的類型推導類似於

template<typename T>
void foo(T p1);

template<typename T>
void bar(T* p2);

int main()
{
    int i;
    foo(&i);
    bar(&i);
}

其中兩個函數都被實例化為void(int *)類型,但在第一種情況下, T被推導為int*而在第二種情況下, T具有int類型。

在變量聲明中使用的auto說明符,使用與模板參數推導中使用的規則相同的規則推導出它的類型。

考慮你的第一個例子(即auto p1 = &i; )。 auto說明符的類型推導如下:

  1. auto被替換為虛構類型模板參數(例如, U p1 = &i; )。
  2. &i type是int* ,因此沒有任何意外,根據模板推導規則, U被推導為int*

現在考慮你的第二個例子(即auto *p2 = &i )。

  1. 再次用假想的類型模板參數替換auto (例如, U* p1 = &i; )。
  2. &i type為int* ,因此根據模板推導規則U推導為int

因此,在auto *p2 = &i; 占位符類型auto將正確地推導為int而不是int* ,這將導致p2的類型為int** ,正如您可能預期的那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM