C語言11中的auto和decltype

2021-06-25 20:50:03 字數 884 閱讀 1767

c語言11中的auto和decltype

2012-12-17 00:00

中國it實驗室佚名

關鍵字:c語言

c++ 11中引入的auto主要有兩種用途:自動型別推斷和返回值佔位。auto在c++ 98中的標識臨時變數的語義,由於使用極少且多餘,在c++ 11中已被刪除。

auto自動型別推斷,用於從初始化表示式中推斷出變數的資料型別。通過auto的自動型別推斷,可以大大簡化我們的程式設計工作。下面是一些使用auto的例子。

auto a; // 錯誤,沒有初始化表示式,無法推斷出a的型別 auto int a = 10 // 錯誤,auto臨時變數的語義在c++ 11中已不存在 auto a = 10 auto c = 'a' auto s("hello"); vectorvcttemp; auto it = vcttemp.begin(); auto ptr = ();

另外,在使用模板技術時,如果某個變數的型別依賴於模板引數,不使用auto將很難確定變數的型別(使用auto後,將由編譯器自動進行確定)。下面是乙個具體的例子。

template void multiply(t t, u u)

auto返回值佔位,主要與decltype配合使用,用於返回值型別後置時的佔位。

template auto multiply(t t, u u)->decltype(t*u)

至於為什麼需要將返回值型別後置,這裡簡單說明一下。如果沒有後置,則函式宣告為decltype(t*u) multiply(t t, u u),但此時模板引數t和u還未宣告,編譯無法通

過。另外,如果非要使用返回值型別前置的形式,也可以將函式宣告為decltype((*(t *)0)*(*(u *)0)) multiply(t t, u u),但這種形式比較晦澀難懂,因此不推薦採用。

C 11中的auto陷阱

c 11中引入的auto關鍵字自動推導型別特性,可能是最方便也最容易理解的特性了。然而,即使是這個簡單特性,也有陷阱,需要我們使用時注意。1 引用型別被推導為非引用型別 例如 foo void arg 上面的 中big會被推導為mybigclass型別,而不是mybigclass 型別,從而導致拷貝...

C 11 auto型別推斷和decltype

1.auto型別推斷 a.引入原因 程式設計時,經常需要將表示式的值賦給變數,這就要求我們在申明變數的時候,明確知道表示式的型別,然而要做到這一點並不容易,於是引入auto讓編譯器幫我們去做型別分析。b.使用注意事項const int const i 1,const ref const i auto...

c 中auto和decltype的區別

c 11中引入了auto型別說明符,用它就能讓編譯器替我們去分析表示式所屬的型別,auto讓編譯器通過初始化值來推算變數的型別。如 auto item vall val2 此處編譯器將根據vall和val2相加的結果來推斷item的型別,假如vall和val2的型別是double,則item的型別就...