C11中auto的使用
C11 中 auto 成為類型指示符(type-specifier)。
auto類型推導:auto 定義的變量,可以根據初始化的值,在編譯時推導出變量名的類型。
int ?main() { ?auto x = 5; // ok x 是 int類型 ? ?auto pi = new auto(1); ?// ok pi 被推導為int *; ? ?const auto *xp = &x, u = 6; // ok xp是const int*類型,u是const int類型 ? ?static auto dx = 0.0; ? ? ? // ok dx 是 double 類型 ? ?auto int b; ? ? ? ? ? ? ? ? // error C11 中 auto不再表示存儲類型指示符 ? ?auto s ; ? ? ? ? ? ? ? ? ? ?// error 沒有初始化值 auto無法推導出s的類型 }由上面的例子可以看出來,auto 并不能代表一個實際的類型聲明(如s的編譯錯誤),只是一個類型聲明的"占位符"。
使用 auto 聲明的變量必須要有初始化值,以讓編譯器推斷出它的實際類型,并在編譯時將auto 占位符替換為真正的數據類型。
auto的推導規則
從上面的示例中可以看到 auto 的一些使用方法。它可以同指針、引用結合起來使用,還可以帶上 cv 限定符(cv-qualifier(修飾詞),const 和 volatile 限定符的統稱)。
int main() { ? int x = 0; ?auto *ip = &x; ?// ok ip ->int*,auto被推導為int ? ?auto ?xp = &x; ?// ok xp -> int* ,auto被推導為int* ? ?auto &c = x; ? ?// ok c -> int &, auto被推導為int ? ?auto ?d = x; ? ?// ok d -> int , auto被推導為int ? ? ? ?const auto e = x; // ok e -> const int; ? ?auto ?f = e; ? ? ?// ok f -> int; ? ?const auto &g = x; // ok g -> const int & ? ?auto & h = g; ? ? ?// ok h -> const int & }由上面的例子可以看出∶
ip 和c的推導結果是很顯然的,auto 在編譯時被替換為 int,因此 a 和c分別被推導為int*和 int&。xp的推導結果說明,其實 auto 不聲明為指針,也可以推導出指針類型。
d 的推導結果說明當表達式是一個引用類型時,auto 會把引用類型拋棄,直接推導成原始類型 int。
e 的推導結果說明,const auto 會在編譯時被替換為 const int。
f的推導結果說明,當表達式帶有const(實際上 volatile 也會得到同樣的結果)屬性時,auto 會把const屬性拋棄掉,推導成 non-const類型 int。
g、h的推導說明,當 auto 和引用(換成指針在這里也將得到同樣的結果)結合時,auto 的推導將保留表達式的 const 屬性。
通過上面的一系列示例,可以得到下面這兩條規則∶
1)當不聲明為指針或引用時,auto 的推導結果和初始化表達式拋棄引用和cv 限定符后類型一致。 2)當聲明為指針或引用時,auto 的推導結果將保持初始化表達式的cv 屬性。
auto 作為函數的形參類型
void func(auto x) { cout<<sizeof(x)<<endl; cout<<typeid(x).name()<<endl; } int main() { int a=10; int ar[]={12,23,34,56,67}; fun(a); fun(ar); } void funr(auto&x) { cout<<sizeof(x)<<endl; cout<<typeid(x).name()<<endl; } int main() { int a=10; int ar[]={12,23,34,45,67}; fun(a); fun(ar); }auto 的限制
struct Foo { auto value=0 //error∶ auto不能用于非靜態成員變量 static const int num=10//OK: num -> static const int }; int main() { int ar[10]={0}; auto br=ar// ok br -> int * auto cr[10]=ar// error : auto 無法定義數組 auto dr[5]={1,2,3,4,5?// error : auto 無法定義數組 }總結:
1、C11 中 auto 成為類型指示符(type-specifier)。
2、auto不能用于函數參數。
3、auto不能用于非靜態成員變量
4、 auto 無法定義數組
5、 實例化模板時不能使用auto作為模板參數。
auto可以推導函數的返回值
template<class T> T my_max(T a,T b) { return a>b?a:b; } int main() { auto x=my_max(12,23); auto y=my_max('a','b'); cout<<x<<endl; cout<<y<<endl; return 0; }總結
以上是生活随笔為你收集整理的C11中auto的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据描述
- 下一篇: Multidimensional Que