當前位置:編程學習大全網 - 編程語言 - c++11的示例

c++11的示例

C++ 11 標準廢除了舊的 C++ 98 標準中 auto 的意思(自動變量類型),改成了自動類型推導的意思。

在標準C/C++,使用變量必須明確的指出其類型(強類型)。然而隨著模板類型的出現以及模版元編程的技巧,指定類型,特別是函數定義明確的指定返回類型,就不容易表示。在這樣的情況下,將中間結果存儲與變量是壹件困難的事情,可能會需要知道特定的元編程程序庫的內部情況。

C++11提供了兩種方法緩解上述所遇到的困難。首先被有明確初始化的變量可以使用auto關鍵字。這會依據該初始化式的具體類型產生變量。示例: auto?otherVariable?=?5;//otherVariable被按照int型來編譯otherVariable 的類是明確定義的。因為5的類型是int,所以編譯器按照“int otherVariable =5;”來編譯。 auto?someStrangeCallableType?=?boost::bind(&SomeFunction,_2,_1,someObject);someStrangeCallableType 的類型是模版函數 boost::bind對特定引數返回的類型,作為編譯器語義分析的壹部分,這個類型能夠簡單地被編譯器決定,但用戶要通過查看來判斷類型就不是壹件容易的事情。

除此之外,C++11還定義了 decltype 能夠被用來在編譯器決定壹個表達式的類型。舉例: int?someInt;decltype(someInt)?otherIntegerVariable?=?5;decltype 和 auto 壹起使用會更為有用,因為 auto 變量的類型只有編譯器知道。然而 decltype 對於那些大量運用運算符重載和特化的類型的代碼的表示也非常有用。

auto 對於減少冗贅的代碼也很有用。舉例而言,程序員不用寫像下面這樣: for(vector<int>::const_iteratoritr=myvec.begin();?itr!=myvec.end();?++itr)可以使用auto簡化為: for(auto?itr?=?myvec.begin();?itr?!=?myvec.end();?++itr)這項差異隨著程序員開始嵌套容器而更為顯著,雖然在這種情況下 typedef 是壹個減少代碼的好方法。

decltype 所表示的類型可以和 auto 推導出來的不同。 #include<vector>int?main(){const?std::vector<int>v(1);auto?a?=?v[0];//a為int類型decltype(v[0])?b?=?0;//b為const?int&類型,即std::vector<int>::operator[](size_type)const的返回類型auto?c?=?0;//c為int類型auto?d?=?c;//d為int類型decltype(c)?e;//e為int類型,c實體的類型decltype((c))?f?=?e;//f為int&類型,因為(c)是左值decltype(0)?g;//g為int類型,因為0是右值return?0;} 在標準C++中,只要在編譯單元內遇到被完整定義的模板,編譯器都必須將其實例化(instantiate)。這會大大增加編譯時間,特別是模板在許多編譯單元內使用相同的參數實例化。看起來沒有辦法告訴C++不要引發模板的實例化。

C++11將會引入外部模板這壹概念。C++已經有了強制編譯器在特定位置開始實例化的語法:

template class std::vector<MyClass>;

而C++所缺乏的是阻止編譯器在某個編譯單元內實例化模板的能力。C++11將簡單地擴充前文語法如下:

extern template class std::vector<MyClass>;

這樣就告訴編譯器不要在該編譯單元內將該模板實例化。

以範圍為基礎的for循環

Boost C++ 定義了許多範圍 (range) 的概念。範圍表現有如受控制的串行 (list),持有容器中的兩點。有序容器是範圍概念的超集 (superset),有序容器中的兩個叠代器 (iterator) 也能定義壹個範圍。這些概念以及操作的算法,將被並入 C++11 標準程序庫。不過 C++11 將會以語言層次的支持來提供範圍概念的效用。

for 語句將允許簡單的範圍叠代:第壹部分定義被用來做範圍叠代的變量,就像被聲明在壹般for循環的變量壹樣,其作用域僅只於循環的範圍。而在:之後的第二區塊,代表將被叠代的範圍。這樣壹來,就有了能夠允許C-style數組被轉換成範圍概念的概念圖。這可以是std::vector,或是其他符合範圍概念的對象。 int?my_array[5]={1,?2,?3,?4,?5};for(int&?x?:?my_array){x?*=?2;}編譯器支持  功能  VS2011  VS2013g++ 4.7  Clang 3.1  auto關鍵字  Yes  Yes  YesYesdecltype關鍵字Yes  Yes  YesYes右值引用(Rvalue references)與移動語義(move semantics)Yes  Yes  YesYesLambda表達式  Yes  Yes  YesYesnullptr關鍵字Yes  Yes  YesYes靜態斷言(static_assert)關鍵字 Yes  Yes  YesYes基於範圍的循環(Range based for loop)語法 Yes  Yes  YesYes函數返回類型後置(Trailing return type in functions)語法Yes  Yes  YesYesfinal關鍵字Yes  Yes  YesYesoverride關鍵字Yes  Yes  YesYes強類型枚舉(Strongly typed enums)Yes  Yes  YesYes前置枚舉聲明(Forward declared enums)  Yes  Yes  YesYes外部模板(extern templates)Yes  Yes  YesYes模板右尖括號嵌套(>> for nested templates)Yes  Yes  YesYesLocal and unnamed types as template argumentsYes  Yes  YesYes變參宏(Variadic macros)Yes  Yes  YesYes新內建類型(New built-in types)Partial(部分)?YesYesInitializer_lists容器No?YesYes顯式類型轉換運算符(explicit type conversion operators)NoYes  YesYes內聯命名空間(Inline namespaces)No?YesYessizeof用在沒實例時的非靜態成員

(sizeof on non-static data members without an instance) No?YesYes改變union成員限制(Changed restrictions on union members)No?YesYesRaw string literals  NoYesYesYesUser defined literals  No?YesYesEncoding support in literals  No?YesYesArbitrary expressions in template deduction contexts  No?YesYes默認方法(Defaulted methods)  NoYes(有條件支持) YesYes刪除方法(Deleted methods)  NoYes(有條件支持) YesYes非靜態成員初始化(Non-static data member initializers)  No?YesYes變參模板(Variadic templates)No?YesYes函數模板中的默認模板參數

(Default template arguments in function templates) No?YesYes模板別名(Template aliases)No?YesYes前置構造函數(Forwarding constructors)No?YesYesnoexcept關鍵字No?YesYesconstexpr關鍵字  No?YesYesAlignment 支持  Partial(部分)Partial(部分)YesYes*this的右值引用No?NoYesC99兼容性(C99compatibility)Partial(部分)Partial(部分)Partial(部分)Partial(部分)線程本地存儲(Thread local storage)Partial(部分)Partial(部分)Partial(部分)  構造函數繼承(Inheriting constructors)No?NoNoGeneralized attributes  No?NoNo通過對比可以發現,Clang在大多數C++11功能實現上處於領先地位,而Visual Studio則稍顯落後。當然,這三個編譯器都有著不錯的子集適用於跨平臺開發。( 註:GCC4.8.1已完全支持C++11,Clang 3.3 也完全支持了C++11。最新版本的Linux 發行版(RHEL 7,CentOS 7,Ubuntu 14.06,都自帶了完全支持C++11的編譯器)

妳可以使用類型推斷、移動語義、右值引用、nullptr,static_assert,range-based參考對比。同時妳還可以使用最終和重寫關鍵字來進行友好的控制。此外,妳還可以通過Enums(例舉)強類型和提前聲明,這裏有幾個改進後的模板包括extern keyword。

遺憾的是,Visual Studio並不支持較多請求的可變參數模板。另壹方面,可變參數宏在這三款編譯器中只支持C99標準。繼承構造函數和廣義屬性這些特性並不是在任何地方都能獲得支持。本地線程存儲是是支持情況最好的壹部分(通過非關鍵字標準)。

下面給出在msdn中列舉的對C++功能的支持

  • 上一篇:四川工業科技學院教育學院怎麽樣
  • 下一篇:蘇州放心早餐怎麽加盟?
  • copyright 2024編程學習大全網