初窺C 11 自動型別推導與型別獲取

2021-06-22 01:11:26 字數 1512 閱讀 9361

auto

話說c語言還處於k&r時代,也有auto a = 1;的寫法。中文譯過來叫自動變數,跟c++11的不同,c語言的auto a = 1;相當與 auto int a = 1;語句。 而c++11的auto是有著嚴格的型別推導出來的。以前是這麼寫

int a = 1;

現在,編譯器知道a是int型了。所以可以這麼寫

auto a = 1;

對於型別比較長的,如vector::iterator這類的,能少敲些字元了。

如果僅僅就這點作用,那麼對程式設計實在沒什麼太大的益處,雖然自動型別推導對於編譯器而言,是個高大上的話題。實際上,作用遠遠不止這點啊。適當地使用auto,會是你的**更優雅,舉例說明:

template

void makeandprocessobject (const builder& builder)

從這**來看,builttype的用處不大,但必須這麼寫才能編譯過。有了auto後,你可以這麼寫

template

void makeandprocessobject(const builder& builder)

這比上段**就優雅些了。可是如果我要返回val的值呢?我們還是要傳入buildtye,

因為c++11並沒有提供通過返回值來推導返回型別

(現在終於明白了,不是系統推導不出來,而是c++11沒有提供罷了,c++14將會有這個特性。2014/5/14)

在看一遍auto a = 1;表示式。發現自動型別推導具有這樣的特點:它可以先不必知道是什麼型別,而是根據後面的資訊來推導。如果我們能把返回型別先用auto代替,然後在給些資訊讓編譯器推導出來,這就需要派上decltype了。

decltype

decltype意為declared type,即宣告型別。decltype(x)表示從x中提取型別。因此,可以這樣寫:

decltype(x) y = x;

當然,x也可以換成乙個表示式,decltype(builder.makeobject())將得到makeobject()返回的型別。如果我們結合auto和decltype就可以寫出如下**:

template

auto makeandprocessobject(const builder& builder) -> decltype(builder.makeobject())

這就是返回型別後置。從上面的例子可以看出,decltype對於模板編寫會有所幫助。如果不用自己寫模板的話,或許用的並不多。

decltype這個特性,bs在2023年就提議標準化這類操作符了。gcc c++編譯器於2008加入該特性,visual c++ 2010以擴充套件形式提供了該特性,到c++11才加入標準。而普及到大眾程式設計師的時間大概是2013前後吧。可見,技術的發展或許快,然而這只是區域性性的。要普及到大眾,速度就有點慢了。想想人生真正奮鬥的時間也就短短幾十年,推廣普及乙個技術,真要消耗人的一生光陰。現在的bs已經是白髮蒼蒼矣。

初窺C 11 自己主動型別推導與型別獲取

auto 話說c語言還處於k r時代,也有auto a 1 的寫法。中文譯過來叫自己主動變數。跟c 11的不同。c語言的auto a 1 相當與 auto int a 1 語句。而c 11的auto是有著嚴格的型別推導出來的。曾經是這麼寫 int a 1 如今,編譯器知道a是int型了。所以能夠這麼...

c 11 型別推導

auto與decltype都是在編譯時期進行自動型別的推導 auto name value 1.int x 0 2.auto p1 x p1 為 int auto 推導為 int 3.auto p2 x p2 為 int auto 推導為 int 4.auto r1 x r1 為 int auto ...

C 11 型別推導auto

在c 11之前,auto關鍵字用來指定儲存期。在新標準中,它的功能變為型別推斷。auto現在成了乙個型別的佔位符,通知編譯器去根據初始化 推斷所宣告變數的真實型別。使用auto會拖慢c 效率嗎?完全不會,因為在編譯階段編譯器已經幫程式設計師推導好了變數的型別。使用auto會拖累c 編譯效率嗎?完全不...