淡:
....................
....................
C++11
C++11,先前被稱作C++0x,即
ISO/IEC 14882:2011。
Wikipedia:C++11
Wikipedia: C++ Technical Report 1
C++11/14/17 Features In VS 2015 RTM
右值引用
C++11增加一個新的非常量引用(reference)類型,稱作右值引用(R-value reference),標記為T &&。右值引用所綁定的臨時對象可以在該臨時對象被初始化之后做修改,這是為了允許move語義。(Wikipedia:C++11)
POD
Wikipedia:
POD (程序設計)
Plain old data structure, 縮寫為POD, 是C++語言的標準中定義的一類數據結構[1],POD適用于需要明確的數據底層操作的系統中。
說人話:POD是標準委員會的老家伙們搞的一組底層數據標準,想讓某些C++對象可以跨平臺交互。
Lambda
[] // 沒有定義任何變量。使用未定義變量會引發錯誤。
[x, &y] // x以傳值方式傳入(默認),y以引用方式傳入。
[&] // 任何被使用到的外部變量都隱式地以引用方式加以引用。
[=] // 任何被使用到的外部變量都隱式地以傳值方式加以引用。
[&, x] // x顯式地以傳值方式加以引用。其余變量以引用方式加以引用。
[=, &z] // z顯式地以引用方式加以引用。其余變量以傳值方式加以引用。
nullptr
C++11引入了新的關鍵字來代表空指針常量:nullptr,將空指針和整數0的概念拆開。nullptr的類型為nullptr_t,能隱式轉換為任何指針或是成員指針的類型,也能和它們進行相等或不等的比較。而nullptr不能隱式轉換為整數,也不能和整數做比較。(wikipeida:C++11)
為了向后兼容,0仍可代表空指針常量。
枚舉類別的前置聲明(forward declaration)
0000
enum Enum1; // C++與C++11中不合法;無法判別大小
enum Enum2 : unsigned int; // 合法的C++11
enum class Enum3; // 合法的C++11,列舉類別使用預設型別int
enum class Enum4: unsigned int; // 合法的C++11
enum Enum2 : unsigned short; // 不合法的C++11,Enum2已被聲明為unsigned int
using別名
類型別名
using也能在C++11中定義一般類型的別名,等同typedef:
typedefvoid(*PFD)(double); // 傳統語法
usingPFD=void(*)(double); // 新增語法
模板別名
template< typename first, typename second, int third>
class SomeType;
template< typename second>
using TypedefName = SomeType
;
可變參數模板
在C++11之前,不論是類模板或是函數模板,都只能按其被聲明時所指定的樣子,接受一組固定數目的模板參數;C++11加入新的表示法,允許任意個數、任意類別的模板參數,不必在定義時將參數的個數固定。
template<typename...Values>classtuple;
使用或禁用對象的默認函數
傳統C++默認構造函數規則:
若用戶定義了任何構造函數,編譯器便不會生成默認構造函數。
否則,編譯器自動生成四個構造函數:默認構造函數(default constructor)、復制構造函數(copy constructor),賦值運算符(copy assignment operatoroperator=)以及析構函數(destructor)
C++11允許顯式地表明采用或拒用編譯器提供的內置函數
structNonCopyable
{
NonCopyable&operator=(constNonCopyable&)=delete;
NonCopyable(constNonCopyable&)=delete;
NonCopyable()=default;
};
= delete的聲明(同時也是定義)也能適用于非內置函數,禁止成員函數以特定的形參調用:
structNoDouble
{
voidf(inti);
voidf(double)=delete;
};
static_assert
想在編譯器測試模板參數的特性,只能用static_assert
template
structCheck
{
static_assert(sizeof(int)<=sizeof(T),"T is not big enough!");
};
hash
C++11四種散列表,其中差別在于底下兩個特性:是否接受具相同鍵值的項目(Equivalent keys),以及是否會將鍵值映射到相對應的數據(Associated values)。為避免與第三方庫發展的散列表發生名稱上的沖突,前綴將采用unordered而非hash。
散列表類型 有無關系值 接受相同鍵值
std::unordered_set 否 否
std::unordered_multiset 否 是
std::unordered_map 是 否
std::unordered_multimap 是 是
頭文件: <unordered_set>和<unordered_map>
正則表達式
頭文件:<regex>
通用智能指針
shared_ptr是一引用計數(reference-counted)指針,其行為與一般C++指針極為相似。在TR1的實現中,缺少了一些一般指針所擁有的特色,像是別名或是指針運算。C++11新增前述特色。
一個shared_ptr只有在已經沒有任何其它shared_ptr指向其原本所指向對象時,才會銷毀該對象。
一個weak_ptr指向的是一個被shared_ptr所指向的對象。該weak_ptr可以用來決定該對象是否已被銷毀。weak_ptr不能被解引用;想要訪問其內部所保存的指針,只能透過shared_ptr。有兩種方法可達成此目的。第一,類別shared_ptr有一個以weak_ptr為參數的構造函數。第二,類別weak_ptr有一個名為lock的成員函數,其回返值為一個shared_ptr。weak_ptr并不擁有它所指向的對象,因此不影響該對象的銷毀與否。
元編程
對于那些能自行創建或修改本身或其它程序的程序,我們稱之為元編程。這種行為可以發生在編譯或運行期。
XXXX
0000
0000
XXXX
0000
0000