在c++11中,auto關鍵字被作為型別自動型別推導關鍵字
(1)基本用法
c++98:型別 變數名 = 初值; int i = 10;
c++11:auto 變數名 = 初值; auto i = 3.14;
借助於auto關鍵字,可對變數進行隱式的型別定義,即由編譯器在編譯期間根據變數的初始化語句,自動推斷出該變數的型別.
auto a = 1;//a被推導為int
auto b = new auto(2);//
b推導為int*
auto const *c = &a;//
在舊語法中,auto型變數儲存於棧區,static型變數儲存於靜態區,二者不能同時使用,但c++11的auto關鍵字已經不再作為儲存型別指示符
static auto i = 4;auto
int j; //
error
auto並不能代表乙個世紀的型別宣告,只是乙個型別宣告的佔位符,使用auto宣告的變數必須馬上初始化,以讓編譯器推斷出它的實際型別並在編譯剪短將auto替換為真的型別
auto k; //error
(2)auto同指標或引用結合使用
即使不把auto宣告為指標,其亦可被推導為指標型別
int a = 0;auto *b = &a; //
auto=int b==>int*
auto c = &a //
auto=int* c==>int*
當表示式帶有引用屬性時,auto會拋棄其引用屬性
auto &d = a; //auto=int d==>int&
auto e = a; //
auto=int e==>int
當表示式帶有cv限定,auto會拋棄其cv限定
auto const f = a; //auto=int f==>int const
auto g = f; //
auto=int g==>int
但是如果auto和引用或指標結合使用,表示式的cv限定會被保留下來
auto const &h = a; //auto=int h==>int const&
auto &i = h; //
auto=int const i==>cosnt &
auto *j = &h; //
auto=int const j==>int const*
(3)auto使用的限制
auto不能用於函式的引數
void foo(auto i)//error 無法推導為int
foo(10);
auto不能用於類的非靜態成員變數
auto不能用於模板的型別實參(模板的型別實參都是)
dummyd1;dummy
d2 = d1; //
error
auto不能用於陣列元素
int a[10];auto b[10] = a;//error
auto c = a; //ok,但是c推斷為int*
auto &d = a; //ok,但是此時a代表的是陣列整體不是首位址
(4)何時使用auto
通過auto減少模板的型別引數
通過auto可以簡化某些複雜型別的書寫
#include #include#include
#include
using
namespace
std;
class
a
intget(void)const
void
set(int arg)
private
:
intm_var;
};class
b
char
const *get(void)const
void
set(char
const *arg)
private
:
char
const *m_var;
};//
c++98版本
templatevoid foo(x const &x)
//c++11版本
templatevoid bar(x const &x)
int main(void
)
C 11 型別推導auto
在c 11之前,auto關鍵字用來指定儲存期。在新標準中,它的功能變為型別推斷。auto現在成了乙個型別的佔位符,通知編譯器去根據初始化 推斷所宣告變數的真實型別。使用auto會拖慢c 效率嗎?完全不會,因為在編譯階段編譯器已經幫程式設計師推導好了變數的型別。使用auto會拖累c 編譯效率嗎?完全不...
C 11特性 auto關鍵字
正文 本文的內容已經不新鮮了。關於auto,翻來覆去被人知道的都是這些東西,本文並沒有提出新穎的auto用法。本人原是痛恨部落格一篇篇都是copy而來缺乏新意的探索,當然,本文不是copy而來,但發布這樣一篇大家皆知的文章心裡甚是惶恐。本文對auto的內容加以整理,權當是自己的複習筆記了。回到頂部 ...
C 11特性 auto關鍵字
本文的內容已經不新鮮了。關於auto,翻來覆去被人知道的都是這些東西,本文並沒有提出新穎的auto用法。本人原是痛恨部落格一篇篇都是copy而來缺乏新意的探索,當然,本文不是copy而來,但發布這樣一篇大家皆知的文章心裡甚是惶恐。本文對auto的內容加以整理,權當是自己的複習筆記了。早在c 98標準...