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

2021-09-07 05:21:40 字數 1568 閱讀 9694

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 編譯效率嗎?完全不...