1. 序列for循環(huán) Range-based for loops
這是不需要多說铺浇,很多語言都有的特性籽御,可以方便的進(jìn)行遍歷:
int array[3]={1,2,3};
for (auto val:array){
cout << val <<endl;
}
2.強(qiáng)類型枚舉 Strongly-typed enums
在傳統(tǒng)C++中腻异,枚舉類型被視為整數(shù)呛哟,這使得兩種不同的枚舉類型之間可以進(jìn)行比較垢袱。C++03 規(guī)定一個(gè)枚舉型值不能隱式轉(zhuǎn)換到另一個(gè)枚舉類型幌甘,但是枚舉變量的名稱仍然暴露在外層作用域中窖式,如:
enum Hand{ Right, Left };
enum Result{ Wrong, Right }; // error
C++11 引進(jìn)了強(qiáng)類型枚舉蚁飒,由關(guān)鍵字enum class標(biāo)識(shí),它不會(huì)導(dǎo)致同一作用域下的枚舉常量出現(xiàn)命名沖突萝喘,也不會(huì)隱式轉(zhuǎn)換為整形淮逻。
enum class Season{Spring, Summer=1, Autumn, Winner};
enum class Vacation{Summer, Winner};
Season s = Season::Summer;
if(s==1) // error: no match for 'operator==' (operand types are 'Season' and 'int')
{
cout << "nice" <<endl;
}
3.可變參數(shù)模板 Variadic templates
C++11新引入了參數(shù)包機(jī)制,概念如下:
- 模板參數(shù)包(template parameter pack):模板參數(shù)位置上的變長(zhǎng)參數(shù)(例子中的Types)阁簸,可以打包0到多個(gè)參數(shù)爬早。
- 函數(shù)參數(shù)包(function parameter pack):函數(shù)參數(shù)位置上的變長(zhǎng)參數(shù)(例子中的args)。
參數(shù)包在使用時(shí)要進(jìn)行展開(Expanded)启妹,語法是包名加上三個(gè)點(diǎn)筛严,如Types...
。下面用遞歸方式展開參數(shù)包的示例:
template <typename ... Ts>
void unpack(Ts... ts){}
template <typename T>
T output(T t){
cout << t << "," << endl;
return t; // 必須返回t饶米,作為dummy
}
template <typename ... Types>
void func_t(Types ... args){
unpack( output(args)... ); // 注意這里的expand方式
}
func_t(1,2,3); // => 3,2,1,
4.lambda函數(shù)
該特性可以讓我們愉快的使用匿名函數(shù):
int a=3;
int b=4;
auto func = [](int x, int y){return x+y;};
cout << func(a,b) << endl; // 像普通函數(shù)一樣調(diào)用
cout << [=]{return a*2;}() <<endl; // 捕獲上下文變量桨啃,直接調(diào)用
再來看匿名函數(shù)的定義:
[capture](parameters) mutable ->return-type {statement}
- [capture]:捕捉列表。捕捉列表總是出現(xiàn)在Lambda函數(shù)的開始處檬输。編譯器根據(jù)該引出符判斷接下來的代碼是否是Lambda函數(shù)照瘾。捕捉列表能夠捕捉上下文中的變量以供Lambda函數(shù)使用;
- (parameters):參數(shù)列表。與普通函數(shù)的參數(shù)列表一致丧慈。如果不需要參數(shù)傳遞析命,則可以連同括號(hào)“()”一起省略;
- mutable:mutable修飾符。默認(rèn)情況下逃默,Lambda函數(shù)總是一個(gè)const函數(shù)鹃愤,mutable可以取消其常量性。在使用該修飾符時(shí)笑旺,參數(shù)列表不可省略(即使參數(shù)為空);
- ->return-type:返回類型。在不需要返回值的時(shí)候可以連同符號(hào)”->”一起省略馍资。在返回類型明確的情況下也可以省略筒主,讓編譯器對(duì)返回類型進(jìn)行推導(dǎo);
- {statement}:函數(shù)體,除了可以使用參數(shù)之外鸟蟹,還可以使用所有捕獲的變量乌妙。
語法上,在“[]”包括起來的是捕捉列表建钥,捕捉列表由多個(gè)捕捉項(xiàng)組成藤韵,并以逗號(hào)分隔。捕捉列表有以下幾種形式:
- [] 不捕捉任何變量
- [&} 捕捉外部作用域中所有變量熊经,并作為引用在函數(shù)體中使用
- [=] 捕捉外部作用域中所有變量泽艘,并拷貝一份在函數(shù)體中使用
- [=, &foo] 捕捉外部作用域中所有變量欲险,并拷貝一份在函數(shù)體中使用,但是對(duì)foo變量使用引用
- [bar] 捕捉bar變量并且拷貝一份在函數(shù)體重使用匹涮,同時(shí)不捕捉其他變量
- [x, &y] x按值傳遞天试,y按引用傳遞
- [this] 捕捉當(dāng)前類中的this指針。如果已經(jīng)使用了&或者=就默認(rèn)添加此選項(xiàng)然低。