[英]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.這意味着p1
和p2
都是指向int
對象的指針對象。
[user@host ~]$ ./test
100 100
這兩個定義p1
和p2
語句之間有什么區別嗎?
不同之處在於,在第一種情況下,auto被推導為int*
而在第二種情況下,auto被推導為int
,這導致p1
和p2
都是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
說明符的類型推導如下:
auto
被替換為虛構類型模板參數(例如, U p1 = &i;
)。 &i
type是int*
,因此沒有任何意外,根據模板推導規則, U
被推導為int*
。 現在考慮你的第二個例子(即auto *p2 = &i
)。
auto
(例如, U* p1 = &i;
)。 &i
type為int*
,因此根據模板推導規則U
推導為int
。 因此,在auto *p2 = &i;
占位符類型auto
將正確地推導為int
而不是int*
,這將導致p2
的類型為int**
,正如您可能預期的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.