Visual Studio 2010中C++的四大變化(2)
Visual Studio 2010中C++的四大變化(2) 軟件測試 微軟即將在2010年4月12日發布Visual Studio 2010的正式版,對于C++語言做了修改,使之更加符合C++標準,文章將對C++語言的修改來做一下分析。 靜態斷言static_assert 在之前的C++標準C++03中,我們可以使用兩
Visual Studio 2010中C++的四大變化(2) 軟件測試
微軟即將在2010年4月12日發布Visual Studio 2010的正式版,對于C++語言做了修改,使之更加符合C++標準,文章將對C++語言的修改來做一下分析。
靜態斷言static_assert
在之前的C++標準C++03中,我們可以使用兩種斷言:
◆使用預處理中的條件編譯和#error指令,可以在預處理階段檢查一些編譯條件。
◆可以使用宏assert來進行運行時檢查,以確保程序邏輯的正確性。
但使用#error方法是非常煩瑣的,并且不能夠對模板參數進行檢查,因為模板實例化是在編譯時進行,而#error方法是在預處理階段進行的。而assert宏是在運行時進行檢查。不難發現,我們缺少了一樣東西,那就是可用于在編譯時檢查的工具。于是,靜態斷言應運而生。
在新的C++標準C++0x中,加入了對靜態斷言的支持,引入了新的關鍵字static_assert來表示靜態斷言。使用靜態斷言,我們可以在程序的編譯時期檢測一些條件是否成立,這個特性在調試模板函數的模板參數時特別有用。在編譯的時候,模板函數實例化,這時我們就可以使用靜態斷言去測試模板函數的參數是否按照我們的設計擁有合適的值。例如下面這段代碼:
template struct Kitten { static_assert(N < 2, "Kitten requires N < 2."); }; int main() { Kitten<1> peppermint; Kitten<3> jazz; return 0; } template struct Kitten { static_assert(N < 2, "Kitten requires N < 2."); }; int main() { Kitten<1> peppermint; Kitten<3> jazz; return 0; }
當我們在主函數中使用“1”去實例化Kitten這個結構體時,在編譯的時候,靜態斷言static_assert會測試參數N的值,當N的值小于2時就會產生一個斷言錯誤,并將相應的調試幫助信息輸出到“Error List”窗口中,這樣程序員就可以對問題快速定位,解決問題就更加方便了。
另外,靜態斷言還帶來很多其他的優勢。例如靜態斷言在編譯時進行處理,不會產生任何運行時刻空間和時間上的開銷,這就使得它比assert宏具有更好的效率。另外比較重要的一個特性是如果斷言失敗,它會產生有意義且充分的診斷信息,幫助程序員快速解決問題。
auto關鍵字
在C++中,auto關鍵字的意義發生了改變。從Visual Studio 2010開始,auto關鍵字將用于指引編譯器根據變量的初始值來決定變量的數據類型。換句話說,我們可以把auto當成一種新的數據類型,它可以“從初始化器(initialize)中推導出所代表的變量的真正類型”。這種對auto關鍵字的使用方式可以大大消除當前替代方式所導致的冗長和易出錯的代碼。我們看一個實際的例子:
#include #include
在這段代碼中,我們使用auto關鍵字來代替了真正的數據類型map::iterator,這使得整個代碼自然而簡潔。另外,跟其他數據類型一樣,我們也可以對auto關鍵字進行修飾,例如添加const,指針(*),左值引用(&),右值引用(&&)等等,編譯器會根據auto類型所代表的真正的數據來決定這些修飾的具體含義。為了兼容一些舊有的C++代碼,我們可以使用/Zc:auto這個編譯器選項,來告訴編譯器是采用auto關鍵字的原有定義還是在新標準C++中的定義。
原文轉自:http://www.anti-gravitydesign.com