stanford-oval/wikipedia huggingface dataset:
李玮 (唐朝)

李玮（647年—682年4月4日），字彦英，吴王李恪第三子，唐太宗之孙。
永徽四年（653年），李恪以谋反罪被赐死，四个儿子被流放到岭表。永淳元年二月廿一日（682年4月4日），李玮在广州南海县去世，享年三十六岁。神龙二年（706年），追封朗陵郡王。
妻冯氏，为大将军、耿国公冯盎的曾孙。冯氏于开元五年十一月廿五日（718年1月1日）去世，享壽七十四岁。开元六年十一月十二日（718年12月8日），李玮与冯氏合葬于龙门之平原。
儿子

李祚，朗陵郡王
李褕，嗣蜀王（出继叔祖父李愔）
参考资料

《大唐故朗陵郡王墓志铭并序》
新郑高速公路

|  北京—港澳高速公路（新乡—郑州） |
| --- | --- |
 新郑高速 
道路
启用时间: 2004年9月30日（最近通車）
主要连接道路
起點端: 河南新乡
終點端: 河南郑州
規劃數據
總長: 94.79公里（58.90英里）
公路系統
中华人民共和国高速公路 中华人民共和国国家高速公路网
新郑高速公路是一条连接河南省新乡市和郑州市的高速公路，是京港澳高速公路的重要组成部分，于2002年4月1日动工，2004年9月30日完工。全长94.79公里，其中黄河二桥全长近10公里。
参考资料

↑  . 大河报. 2004年10月1日  [2011年9月28日]. （原始内容存档于2011年1月25日） （中文（简体））.
军营密恋

| 军营密恋 |
| --- | --- |

别名: 这个军营很有爱
类型: 爱情、剧情、浪漫喜剧
格式: 电视剧
主演:  皮拉瓦·山坡提拉  帕塔拉萨雅·克苏菀斯莉  帕瓦·吉沙晚迪  查妮甘·唐卡伯缇  林阳  纳查特·佳塔潘 
语言: 泰語
季数: 不适用
集数: 不适用
制作
拍攝地點:  泰國
播出 
首播频道:  泰國GMMTV
图像制式: 
声音制式: 立体声
播出国家／地区:  泰國
 
《军营密恋》（泰語：；英語：）是被取消的电视剧集，本由皮拉瓦·山坡提拉（Krist）、帕塔拉萨雅·克苏菀斯莉（Peak）、欧帕瓦·吉沙晚迪（Ohm）等人主演的一部泰国爱情电视剧。2020年9月9日，主演皮拉瓦·山坡提拉宣布该系列因不明原因而被取消。2020年9月23日，由于COVID-19大流行，GMMTV与另一剧集《女魔头之恋》一起发布了取消制作的官方声明。
此剧曾在2019年10月15日GMMTV的“New & Next”活动中发布的2020年播出的十二部电视剧之一。
演员阵容

注：括号内为演员或角色之小名。
皮拉瓦·山坡提拉 饰 Ice，服兵役的大明星，后为了追求Namwhan而决定继续服役。
帕塔拉萨雅·克苏菀斯莉 饰 Namwhan，美丽又严肃的军医，育有一女Bow。
帕瓦·吉沙晚迪
查妮甘·唐卡伯缇 饰 Bow，Namwhan的女儿，Ice的超级粉丝。后因为了追求继续服役的Ice而决定入伍。
林阳 饰 士兵，Bow的朋友。
纳查特·佳塔潘（泰语：）
外部连接

《军营密恋》于MyDramaList上的剧集介绍
豆瓣电影上《军营密恋》的資料 （简体中文）
李如富

李如富（1929年—2021年3月12日），南京大屠杀见证者，自己和家人都是平民。
见证

日军在南京战役期间，把李如富的三舅当成人型靶来练习枪法，远远的对他开枪。三舅终因伤重不治，在床上躺了四五天后去世。二哥在碾米时，日军为了取乐，拿枪打伤了他的腿。
见证 > 证言

我的二哥在碾米的时候，被日本兵开枪把腿打伤了。后来三舅在路上碰到巡逻的日本兵，日本兵可能是想拿我三舅当靶子比试枪法，远远的对着我三舅开枪，我三舅被打伤，在床上躺了四五天后去世了。
参考来源

1 2  . 中国新闻网. 2021-03-13  [2021-06-17]. （原始内容存档于2021-03-13）.
C++11

C++11，先前被稱作C++0x，即ISO/IEC 14882:2011，是C++程式語言的一个標準。它取代第二版標準ISO/IEC 14882:2003（第一版ISO/IEC 14882:1998公開於1998年，第二版於2003年更新，分别通稱C++98以及C++03，两者差异很小），且已被C++14取代。相比于C++03，C++11標準包含核心語言的新機能，而且擴展C++標準程式庫，併入了大部分的C++ Technical Report 1程式庫（數學的特殊函式除外）。
ISO／IEC JTC1/SC22/WG21 C++標準委員會計劃在2010年8月之前完成對最終委員會草案的投票，以及於2011年3月召開的標準會議完成國際標準的最終草案。然而，WG21預期ISO將要花費六個月到一年的時間才能正式發佈新的C++標準。為了能夠如期完成，委員會決定致力於直至2006年為止的提案，忽略新的提案。最终于2011年8月12日公布，并于2011年9月出版。
2012年2月28日的國際標準草案是最接近于C++11标准的草案，差异仅有编辑上的修正。
像C++這樣的程式語言，透過一種演化的過程來發展其定義。這個過程不可避免地將引發與現有程式碼的相容問題，在C++的發展過程中偶爾會發生。不過根據比雅尼·斯特劳斯特鲁普（C++的創始人並且是委員會的一員）表示，新的標準將幾乎100%相容於現有標準。
设计原则

C++的修訂包含核心語言以及標準程式庫。
在發展新標準的每個機能上，委員會採取了幾個方向：
維持穩定性和與C++98，可能的話還有C之間的兼容性；
儘可能不透過核心語言的擴展，而是透過標準程式庫來引進新的特性；
能夠演進編程技術的變更優先；
改進C++以幫助系統以及函式庫設計，而不是引進只針對特別應用的新特性；
增進型別安全，提供對現行不安全的技術更安全的替代方案；
增進直接對硬體工作的能力與表現；
提供現實世界中問題的適當解決方案；
實行“zero-overhead”原則（某些功能要求的額外支援只有在該功能被使用時才能使用）；
使C++易於教授與學習
关照初學者被認為是重要的，因為他們構成了計算機程序員的主體。也因為許多初學者不願擴展他們對C++的知識，只限於使用他們對C++專精的部分。此外，考慮到C++被廣泛的使用（包含應用領域和編程風格），即便是最有經驗的程序員在面對新的編程范式時也會成為初學者。
C++核心語言的擴充

C++委員會的主要作用之一是改善語言核心。核心語言將被大幅改善的領域包括多线程支援、泛型編程、統一的初始化，以及效能表現的加強。
在此分成4個區塊來討論核心語言的特色以及變更：
執行期表現強化、建構期表現強化、可用性強化，還有新的功能。某些特性可能會同時屬於多個區塊，但在此僅於其最具代表性的區塊描述。
核心語言的執行期表現強化

以下的語言機能主要用來提升某些效能表現，像是記憶體或是速度上的表現。
核心語言的執行期表現強化 > 右值引用和move語意

在C++03及之前的標準，臨時對象（稱為右值"R-values"，因为它们通常位於賦值運算子右侧）無法被改變，在C中亦同（且被視為等同于const T&）。儘管如此，在某些情況下臨時對象仍然可能會被改變，但这种表现也被視為是一個有用的漏洞。
C++11增加一個新的非常數引用（reference）型別，稱作右值引用（R-value reference），標記為T &&。右值引用所绑定的臨時對象可以在該臨時對象被初始化之後做修改，這是為了允許move語意。
C++03低性能问题的之一，就是在以传值方式传递对象时隐式发生的耗時且不必要的深度拷貝。舉例而言，std::vector<T>本质上是一个C-style陣列及其大小的封裝，如果一個std::vector<T>的臨時物件是在函式内部或者函数返回时创建，要將其儲存就只能透過生成新的std::vector<T>並且把該臨時物件所有的資料複製过去（為了討論上的方便，這裡忽略返回值优化）。然后該臨時物件會被析构，其使用的記憶體会被释放。
在C++11，把一個vector的右值引用作为参数std::vector的"move建構子"，可以把右值参数所绑定的vector內部的指向C-style陣列的指標複製给新的vector，然後把该指標置null。由于临时变量不会被再次使用，所以不会有代码去访问该null指针；又因为该指针为null，当该临时对象超出作用域时曾经指向的內部C-style陣列所使用的内存不会被释放。因此，该操作不仅无形中免去了深拷贝的开销，而且还很安全。
右值引用作为数据类型的引入，使得函数可以重载区分它的参数是值类型、传统的左值引用还是右值引用。这让除了标准库的现有代码无须任何改动就能等到性能提升。一个返回std::vector<T>的函数的返回类型无须为了调用move构造函数而显式修改为std::vector<T>&&，因为临时对象自动作为右值。（但是，如果std::vector<T>是没有move构造函数的C++03版，由于传统的左值引用也可以绑定到临时对象上，因此具有const std::vector<T>&参数的复制构造函数会被调用，导致一次显著的内存分配。）
出于安全的考虑，推行了一些限制。具名的变量被認定為左值，即使它是被宣告为右值引用数据类型；為了獲得右值必須使用显式类型转换，如模板函数std::move<T>()。右值引用所绑定的对象应该只在特定情境下被修改，主要用于move构造函数中。
bool is_r_value(int &&) { return true; }
bool is_r_value(const int &) { return false; }

void test(int && i)
{
    is_r_value(i); // i為具名變數，即使被宣告成右值引用类型，i作为实参表达式也不會被認定是右值表达式。
    is_r_value(std::move<int&>(i)); // 使用std::move<T>()取得右值。
}
由於右值引用的语义特性以及對於左值引用（L-value references;regular references）的某些语义修正，右值引用让開發者能够提供函数参数的完美轉發（perfect function forwarding）。當與不定長參數模板結合，這項能力允許函式模板能夠完美地轉送参数給其他接受這些特定参数的函式。最大的用處是轉送建構子參數，創造出能夠自動為這些特定参数呼叫正確建構式的工廠函式（factory function）。这个用法可以在C++标准库中的emplace_back（页面存档备份，存于）方法中看到。
核心語言的執行期表現強化 > constexpr – 泛化的常數表示式

C++本來就已具備常數表示式（constant expression）的概念。像是3+4總是會產生相同的結果並且沒有任何的副作用。常數表示式對編譯器來說是最佳化的機會，編譯器時常在編譯期執行它們並且將值存入程式中。同樣地，在許多場合下，C++規格要求使用常數表示式。例如在陣列大小的定義上，以及列舉值（enumerator values）都要求必須是常數表示式。
然而，常數表示式不能含有函式呼叫或是物件建構式。所以像是以下的例子是不合法的：
int GetFive() {return 5;}

int some_value[GetFive() + 7]；// 欲產生12個整數的陣列。不合法的C++寫法
這在C++03中是不合法的，因為GetFive() + 7並不是常數表示式。C++03編譯器無從得知GetFive實際上在執行期是常數。理論上而言，這個函式可能會影響全域變數，或者呼叫其他的非執行期（non-runtime）常數函式等。
C++11引進關鍵字constexpr允許使用者保證函式或是物件建構式是編譯期常數。以上的例子可以被寫成像是下面這樣：
constexpr int GetFive() {return 5;}

int some_value[GetFive() + 7]；// 欲產生12個整數的陣列。合法的C++11寫法
這使得編譯器能夠瞭解並去驗證GetFive是個編譯期常數。
用constexpr修饰函数将限制函式的行为。首先，該函式的回返值型別不能為void。第二，函式的內容必須依照"return expr"的形式。第三，在参数替换後，expr必須是個常數表示式。這些常數表示式只能夠呼叫其他被定義為constexpr的函式，或是其他常數表示式的資料變數。最後，有著這樣修饰符的函式直到在該編譯單元內被定義之前是不能夠被呼叫的。
声明为constexpr的函数也可以像其他函数一样用于常量表达式以外的地方，此时不需要满足后两点。
C++11之前，可以在常量表达式中使用的变量必须被声明为const，用常量表达式来初始化，并且必须是整型或枚举类型。C++11去除了变量必须是整型或枚举类型的限制，只要变量使用了constexpr关键字来定义：
constexpr double earth_gravitational_acceleration = 9.8;
constexpr double moon_gravitational_acceleration = earth_gravitational_acceleration / 6.0;
这些变量都是隐式常量，必须使用常量表达式来初始化。
為了让使用者自定义型別（user-defined type）参与建構常量表示式，建構式也可以用constexpr来声明。與constexpr函式一樣，constexpr建構式必須在該編譯單元內使用之前被定義。它的函数体必须为空。它必須用常量表示式初始化他的成員（member）。而這種型別的解構式應當是平凡的（trivial）。
拥有constexpr构造函数的类型的复制构造函数通常也應該被定義為constexpr，以便该类型的对象以值传递的方式从constexpr函数返回。该類別的任何成員函式，像是複製建構式、运算符重载函数等等，只要他們符合常數表达式函式的定義，都可以被宣告成constexpr。使得編譯器能夠在編譯期進行類別的複製、對他們施行運算等等。
常數表达式函式或建構式，可以以非常數表示式（non-constexpr）作为參數喚起。就如同constexpr整數字面值能夠指派給non-constexpr變數，constexpr函式也可以接受non-constexpr參數，其結果儲存於non-constexpr變數。constexpr關鍵字只有當表示式的成員都是constexpr，才允許編譯期常數性的可能。
核心語言的執行期表現強化 > 對POD定義的修正

在C++03中，一個类（class）或結構（struct）要想被作为POD，必須遵守幾條規則。符合這種定義的型別能夠產生與C相容的物件内存佈局（object layout），而且可以被静态初始化。但C++03标准严格限制了何种类型与C兼容或可以被静态初始化的，尽管并不存在技术原因导致编译器无法处理。如果创建一个C++03 POD类型，然后为其添加一个非虚成员函数，这个类型就不再是POD类型了，从而无法被静态初始化，也不再与C兼容，尽管其内存布局并没有发生变化。
C++11通过把POD概念划分成两个概念：平凡的（trivial）和标准布局（standard-layout），放寬了關於POD的定義。
一个平凡的类型可以被静态初始化，意味着使用memcpy来复制数据是合法的，而无须使用复制构造函数。平凡的类型对象的生命周期开始于其存储空间被分配时，而不是其构造函数完成时。使用模版类std::is_trivial<T>::value来判断数据类型是否为平凡类型
一個平凡的類別或結構符合以下定義：
平凡的預設建構式。這可以使用預設建構式語法，例如SomeConstructor() = default;
平凡的複製建構式和move构造函数，可使用預設語法（default syntax）
平凡的賦值運算子和move赋值操作符，可使用預設語法（default syntax）
平凡的解構式，不可以是虛函数（virtual）
类没有虚基类和虚成员函数
复制构造函数和赋值操作符还额外要求所有非静态数据成员都是平凡的。
一个符合标准布局的类封装成员的方式与C兼容。使用模版类std::is_standard_layout<A>::value来判断类型是否是一个标准布局类型。一個標準佈局（standard-layout）的類別或結構符合以下定義：
所有non-static成員有相同的存取控制（public，private，protected）
沒有虛擬函式
沒有虛基類
所有基礎類別符合標準佈局
所有非靜態的（non-static）資料成員属于符合標準佈局的類別
类中第一个非静态類別与基类不是同一个類別。例如：struct A:B{ B b; int c;}不符合要求
两种情况必局其一：或者所有基礎類別都没有non-static成員；或者最派生類別沒有non-static資料成員且至多一個帶有non-static成員的基礎類別。基本上，在該類別的繼承體系中只會有一個類別帶有non-static成員。
一个类、结构、联合只有在其是平凡的、符合标准布局，并且所有非静态成员和基类都是POD时，才被视为POD。使用<type_traits>中的is_pod<T>::value判断T是不是POD类型
通过划分，使得放弃一个特性而不失去另一个成为可能。一个具有复杂的复制和move构造函数的类可能不是平凡的，但是它可能符合标准布局，从而能与C程序交互。类似地，一个同时具有public和private数据成员的类不符合标准布局，但它可以是平凡的，从而能够使用memcpy来复制。
核心語言建構期表現的加強 > 外部模板

在標準C++中，只要在編譯單元內遇到被完整定義的模板，编译器都必須將其具現化（instantiate）。這會大大增加編譯時間，特別是模板在許多編譯單元內使用相同的參數具現化。看起来沒有辦法告訴C++不要引發模板的具現化。
C++11將會外部模板这一。C++已經有了強制編譯器在特定开始具現化的語法：
template class std::vector<MyClass>;
而C++所缺乏的是阻止編譯器在某個編譯單元內具現化模板的能力。C++11將簡單擴充前文語法如下：
extern template class std::vector<MyClass>;
這样就告訴編譯器不要在該編譯單元內將該模板具現化。
核心語言使用性的加強

這些特色存在的主要目的是為了使C++能夠更容易使用。舉凡可以增進型別安全，減少程式碼重複，不易誤用程式碼之類的。
核心語言使用性的加強 > 初始化列表

標準C++從C帶來了初始化列表（initializer list）的概念。這個構想是結構或是数组能夠依據成員在該結構內定義的順序透過給予的一串引數來產生。這些初始化列表是遞迴的，所以結構的数组或是包含其他結構的結構可以使用它們。這對靜態列表或是僅是把結構初始化為某值而言相當有用。C++有构造函数，能夠重複对象的初始化。但單單只有那樣並不足以取代這項特色的所有機能。在C++03中，只允許在嚴格遵守POD的定義和限制條件的結構及類別上使用這項機能，非POD的型別不能使用，就連相當有用的STL容器std::vector也不行。
C++11將會把初始化列表的概念綁到型別上，稱作std::initializer_list。這允許构造函数或其他函数像參數般地使用初始化列表。舉例來說：
class SequenceClass
{
public:
  SequenceClass(std::initializer_list<int> list);
};
這將允許SequenceClass由一連串的整數构造，就像：
SequenceClass someVar = {1, 4, 5, 6};
這個构造函数是種特殊的构造函数，稱作初始化列表构造函数。有著這種构造函数的類別在統一初始化的時候會被特別對待。
類別std::initializer_list<>是個第一級的C++11標準程式庫型別。然而他們只能夠經由C++11編譯器透過{}語法的使用被靜態地构造。這個列表一經构造便可複製，雖然這只是copy-by-reference。初始化列表是常數；一旦被建立，其成員均不能被改變，成員中的資料也不能夠被變動。
因為初始化列表是真實型別，除了類別构造式之外還能夠被用在其他地方。正規的函数能夠使用初始化列表作為形参。例如：
void FunctionName(std::initializer_list<float> list);

FunctionName({1.0f, -3.45f, -0.4f});
標準容器也能夠以這種方式初始化：
vector<string> v = { "xyzzy", "plugh", "abracadabra" };
vector<string> v({ "xyzzy", "plugh", "abracadabra" });
vector<string> v{ "xyzzy", "plugh", "abracadabra" };//见下节“统一的初始化”
核心語言使用性的加強 > 統一的初始化

標準C++在初始化型別方面有著許多問題。初始化型別有數種方法，而且交換使用時不會都產生相同結果。傳統的建構式語法，看起來像是函式宣告，而且為了能使編譯器不會弄錯必須採取一些步驟。只有集合體和POD型別能夠被集合式的初始化（使用SomeType var = {/*stuff*/};）。
C++11將會提供一種統一的語法初始化任意的物件，它擴充了初始化串列語法：
struct BasicStruct
{
 int x;
 float y;
};

struct AltStruct
{
  AltStruct(int _x, float _y) : x(_x), y(_y) {}

private:
  int x;
  float y;
};

BasicStruct var1{5, 3.2f};
AltStruct var2{2, 4.3f};
var1的初始化的運作就如同C-style的初始化串列。每個公開的變數將被對應於初始化串列的值給初始化。隱式型別轉換會在需要的時候被使用，這裡的隱式型別轉換不會產生範圍縮限（narrowing）。要是不能夠轉換，編譯便會失敗。（範圍縮限 （narrowing）：轉換後的型別無法表示原型別。如將32-bit的整數轉換為16-bit或8-bit整數，或是浮點數轉換為整數。）var2的初始化則是簡單地呼叫建構式。
統一的初始化建構能夠免除具體指定特定型別的必要：
struct IdString
{
  std::string name;
  int identifier;
};

IdString var3{"SomeName", 4};
該語法將會使用const char *參數初始化std::string。你也可以做像下面的事：
IdString GetString()
{
  return {"SomeName", 4}; // 注意這裡不需要明確的型別
}
統一初始化不會取代建構式語法。仍然會有需要用到建構式語法的時候。如果一個類別擁有初始化列表构造函数（TypeName(initializer_list<SomeType>);），而初始化串列与构造函数的参数类型一致，那麼它比其他形式的建構式的優先權都來的高。C++11版本的std::vector將會有初始化串列建構式。這表示：
std::vector<int> theVec{4};
這將會呼叫初始化串列建構式，而不是呼叫std::vector只接受一個尺寸參數產生相應尺寸vector的建構式。要使用這個建構式，使用者必須直接使用標準的建構式語法。
核心語言使用性的加強 > 型別推導

在C++03和C，使用變數必須明確的指出其型別。然而，隨著模版型別的出現以及模板超編程的技巧，某物的型別，特別是函式定義明確的回返型別，就不容易表示。在這樣的情況下，將中間結果儲存於變數是件困難的事，可能會需要知道特定的超編程程式庫的內部情況。
C++11提供兩種方法緩解上述所遇到的困難。首先，有被明確初始化的變數可以使用auto關鍵字。对于指针类型，声明为auto* 或者auto 是一样的。对于引用类型，必须使用auto & 。這會依據該初始化子（initializer）的具體型別產生變數：
auto integralVariable = 5;
auto unsignedVariable = 5UL;
auto ptrToObject = new MyPackage::Object();
在上面的简易例子中，程序员和编译器都能轻易判断出几个变量的类型。而通过使用UL后缀，unsignedVariable的类型自动成为unsigned long。最后，动态创建对象时已经要在 new 后输入类型，此时使用 auto 就能省略掉累赘的MyPackage::Object*声明。
using namespace std::placeholders;
auto someStrangeCallableType = std::bind(&SomeFunction, _2, _1, someObject);
auto otherVariable = 5;
上面的例子中说明auto有利于C++支援函数式编程。这里注意std::bind也是C++11从Boost C++ Libraries中引入的模版函数。std::bind实现了偏函数，在上面的例子中它将函数SomeFunction的第三个参数绑定为someObject，并将第一和第二个参数的在参数列表中的顺序倒转，由此生成一个函数对象someStrangeCallableType。该函数对象的类型非常复杂，但编译器却能轻易地将其推导出来。
除此之外，decltype能夠被用來在編譯期決定一個表示式的型別。舉例：
int someInt;
decltype(someInt) otherIntegerVariable = 5;
decltype和auto一起使用會更為有用，因為auto變數的型別只有編譯器知道。然而decltype對於那些大量運用運算子重載和特化的型別的程式碼的表示也非常有用。
auto對於減少冗贅的程式碼也很有用。舉例而言，程式員不用寫像下面這樣：
for (vector<int>::const_iterator itr = myvec.cbegin(); itr != myvec.cend(); ++itr)
而可以用更簡短的
for (auto itr = myvec.cbegin(); itr != myvec.cend(); ++itr)
由于"myvec"实现了begin/end迭代器，C++11提供了基于范围的循环来大幅度省略代码。
for (auto& x : myvec)
這項差異隨著程式員開始嵌套容器而更為顯著，雖然在這種情況下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是右值
}
核心語言使用性的加強 > 基于范围的for迴圈

for语句將允許簡單的範圍迭代：
int my_array[5] = {1, 2, 3, 4, 5};
// double the value of each element in my_array:
for (int &x : my_array)
{
  x *= 2;
}
// similar but also using type inference for array elements
for (auto &x : my_array) {
    x *= 2;
}
上面for述句的第一部份定義被用來做範圍迭代的变量，就像被宣告在一般for迴圈的变量一樣，其作用域僅只於迴圈的範圍。而在":"之後的第二區塊，代表將被迭代的範圍。这种for语句还可以用于C型数组，初始化列表，和任何定义了begin()和end()来返回首尾迭代器的类型。
核心語言使用性的加強 > Lambda函式與表示式

在標準C++，特別是當使用C++標準程式庫演算法函式諸如sort和find，使用者經常希望能夠在演算法函式呼叫的附近定義一个临时的述部函式（又称谓词函数，predicate function）。由于語言本身允許在函式內部定義類別，可以考虑使用函数对象，然而這通常既麻煩又冗贅，也阻礙了程式碼的流程。此外，標準C++不允許定義於函式內部的類別被用於模板，所以前述的作法是不可行的。
C++11對lambda（即匿名函数）的支援可以解決上述問題。
一個lambda函式可以用如下的方式定義：
[](int x, int y) { return x + y; }
這個不具名函式的回返型別是decltype(x+y)。只有在lambda函式符合"return expression"的形式下，它的回返型別才能被忽略。在前述的情況下，lambda函式僅能為一個述句。
在一個更為複雜的例子中，回返型別可以被明確的指定如下：
[](int x, int y) -> int { int z = x + y; return z + x; }
本例中，一個暫時的變數z被建立用來儲存中間結果。如同一般的函式，z的值不會保留到下一次該不具名函式再次被呼叫時。
如果lambda函式沒有傳回值（例如void），其回返型別可被完全忽略。
定義在與lambda函式相同作用域的變數參考也可以被使用。這種的變數集合一般被稱作closure（閉包）。
[]      // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入（默认），y以引用方式传入。
[&]     // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]     // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
closure被定義與使用如下：
std::vector<int> someList;
int total = 0;
std::for_each(someList.begin(), someList.end(), [&total](int x) {
  total += x;
});
std::cout << total;
上例可計算someList元素的總和並將其印出。變數total是lambda函式closure的一部分，同時它以引用方式被传递入谓词函数，因此它的值可被lambda函式改變。
若不使用引用的符號&，則代表變數以傳值的方式傳入lambda函式。讓使用者可以用這種表示法明確區分變數傳遞的方法：傳值，或是傳參考。由於lambda函式可以不在被宣告的地方就地使用（如置入std::function物件中）；
這種情況下，若變數是以傳參考的方式連結到closure中，是無意義甚至是危險的行為。
若lambda函式只在定義的作用域使用，則可以用[&]宣告lambda函式，代表所有引用到stack中的變數，都是以參考的方式傳入，不必一一顯式指明：
std::vector<int> someList;
int total = 0;
std::for_each(someList.begin(), someList.end(), [&](int x) {
  total += x;
});
變數傳入lambda函式的方式可能隨實做有所變化，一般期望的方法是lambda函式能保留其作用域函式的stack指標，藉此存取區域變數。
若使用[=]而非[&]，則代表所有的參考的變數都是傳值使用。
對於不同的變數，傳值或傳參考可以混和使用。比方說，使用者可以讓所有的變數都以傳參考的方式使用，但帶有一個傳值使用的變數：
int total = 0;
int value = 5;
[&, value](int x) { total += (x * value); };
total是傳參考的方式傳入lambda函式，而value則是傳值。
若一個lambda函式被定義於某類別的成員函式中，则可以使用該類別物件的參考，並且能夠存取其內部的成員。
[](SomeType *typePtr) { typePtr->SomePrivateMemberFunction(); };
這只有當該lambda函式創建的作用域是在SomeType的成員函式內部時才能運作。
在成員函式中指涉物件的this指標，必須要顯式的傳入lambda函式，否則成員函式中的lambda函式無法使用任何該物件的變數或函式。
[this]() { this->SomePrivateMemberFunction(); };
若是lambda函式使用[&]或是[=]的形式，this在lambda函式即為可見。
lambda函式是編譯器從屬型別的函式物件；這種型別名稱只有編譯器自己能夠使用。如果使用者希望將lambda函式作為參數傳入，該型別必須是模版型別，或是必須創建一個std::function去獲取lambda的值。使用auto關鍵字讓我們能夠儲存lambda函式：
auto myLambdaFunc = [this]() { this->SomePrivateMemberFunction(); };
auto myOnheapLambdaFunc = new auto([=] { /*...*/ });
lambda函数按照值方式捕获的环境中的变量，是不能修改的。否则，编译器会报错：“by copy capture cannot be modified in a non-mutable lambda”。其值是lambda函数定义时捕获的值，不再改变。如果在lambda函数定义时加上mutable关键字，则该捕获的传值变量是可以修改的，对同一个lambda函数的随后调用也会累加影响该捕获的传值变量，但对外界环境中被捕获的那个变量无影响。例如：
#include <iostream> 
using namespace std;
int main()
{
 size_t t = 9;
 auto f = [t]() mutable {return t; };
 cout << f() << endl;
 t = 100;
 cout << f() << endl;
 cout << "t:" << t << endl;
 return 0;
}
核心語言使用性的加強 > 返回型別後置的函式宣告

標準C函式宣告語法對於C語言已經足夠。演化自C的C++除了C的基礎語法外，又擴充額外的語法。然而，當C++變得更為複雜時，它暴露出許多語法上的限制，特別是針對函數模板的宣告。下面的範例，不是合法的C++03：
template< typename LHS, typename RHS> 
  Ret AddingFunc(const LHS &lhs, const RHS &rhs) {return lhs + rhs;} //Ret的型別必須是(lhs+rhs)的型別
Ret的型別由LHS與RHS相加之後的結果的型別來決定。即使使用C++11新加入的decltype來宣告AddingFunc的返回型別，依然不可行。
template< typename LHS, typename RHS> 
  decltype(lhs+rhs) AddingFunc(const LHS &lhs, const RHS &rhs) {return lhs + rhs;} //不合法的C++11
不合法的原因在於lhs及rhs在定義前就出現了。直到剖析器解析到函數原型的後半部，lhs與rhs才是有意義的。
針對此問題，C++11引進一種新的函數定義與聲明的語法：
template< typename LHS, typename RHS> 
  auto AddingFunc(const LHS &lhs, const RHS &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}
這種語法也能套用到一般的函數定義與聲明：
struct SomeStruct
{
  auto FuncName(int x, int y) -> int;
};

auto SomeStruct::FuncName(int x, int y) -> int
{
  return x + y;
}
關鍵字auto的使用與其在自動型別推導代表不同的意義。
核心語言使用性的加強 > 物件建構的改良

在C++03中，建構式不能呼叫其它的建構式；每個建構式必須自己初始化所有的成員或是呼叫一個共用的成員函式。基礎類別的建構式不能夠直接作為衍生類別的建構式；就算基類的建構式已經足夠，每個衍伸的類別仍必須實做自己的建構式。類別中non-constant的資料成員不能夠在宣告的地方被初始化，它們只能在建構式中被初始化。
C++11將會提供這些問題的解決方案。
C++11允許建構式呼叫其他建構式，這種做法稱作委託（delegation）构造。僅僅只需要加入少量的代碼，就能讓數個建構式之間達成功能復用（reuse）。Java以及C♯都有提供這種功能。C++11語法如下：
class SomeType {
  int number;
  string name;
  SomeType( int i, string& s ) : number(i), name(s){}
public:
  SomeType( )           : SomeType( 0, "invalid" ){}
  SomeType( int i )     : SomeType( i, "guest" ){}
  SomeType( string& s ) : SomeType( 1, s ){ PostInit(); }
};

class DCExcept{			
    public:			
        DCExcept(double d)			
            try : DCExcept(1, d){			
                cout << "run the body." << endl;			
            }catch(...){			
                cout << "caught exception."<<endl;			
            }			
    private:			
        DCExcept(int i, double d){			
            cout << "going to throw" << endl;			
            throw 0;			
        }			
			
        int type;			
        double date;			
};
C++03中，建構式執行結束代表物件建構完成；
而允許使用轉接建構式的C++11則是以"任何"一個建構式結束代表建構完成。使用委托的建構式，函式本體中的代碼將於被委托的建構式完成後繼續執行（如上例的PostInit()）。若基類使用了委托建構式，則衍生類別的建構式會在"所有"基底類別的建構式都完成後，才會開始執行。
C++11允許衍生類別手動繼承基底類別的建構式，編譯器可以使用基底類別的建構式完成衍生類別的建構。而將基類的建構式帶入衍生類的動作，無法選擇性地部分帶入，要不就是繼承基類全部的建構式，要不就是一個都不繼承（不手動帶入）。此外，若牽涉到多重繼承，從多個基底類別繼承而來的建構式不可以有相同的函式簽名（signature）。而衍生類別的新加入的建構式也不可以和繼承而來的基底建構式有相同的函式簽名，因為這相當於重複宣告。
語法如下：
class BaseClass
{
public:
  BaseClass(int iValue);
};

class DerivedClass : public BaseClass
{
public:
  using BaseClass::BaseClass;
};
此語法等同於DerivedClass宣告一個DerivedClass(int)的建構式。同時也因為DerivedClass有了一個繼承而來的建構式，所以不會有預設建構式。
另一方面，C++11可以使用以下的語法完成数据成員的原地（in-place)初始化：
class SomeClass
{
public:
  SomeClass() {}
  explicit SomeClass(int iNewValue) : iValue(iNewValue) {}

private:
  int iValue = 5;
};
若是建構式中沒有設定iValue的初始值，則會採用類別定義中的成員初始化，令iValue初值為5。在上例中，無參數版本的建構式，iValue便採用預設所定義的值；而帶有一個整數參數的建構式則會以指定的值完成初始化。
成員初始化除了上例中的賦值形式（使用"="），也可以採用建構式以及統一形的初始化（uniform initialization，使用"{}"）。
核心語言使用性的加強 > 顯式虛函數重載

在C++裡，在子類別中容易意外的重載虛函數。舉例來說：
struct Base {
    virtual void some_func();
};

struct Derived : Base {
    void some_func();
};
Derived::some_func的真實意圖為何？程序員真的試圖重載該虛函數，或這只是意外？這也可能是base的維護者在其中加入了一個與Derived::some_func同名且擁有相同簽名的虛函式。
另一個可能的狀況是，當基類中的虛函式的簽名被改變，子類中擁有舊簽名的函式就不再重載該虛函式。因此，如果程序員忘記修改所有子類，執行期將不會正確呼叫到該虛函式正確的實現。
C++11將加入支援用來防止上述情形產生，並在編譯期而非執行期捕獲此類錯誤。為保持向後兼容，此功能將是選擇性的。其語法如下：
struct Base {
    virtual void some_func(float);
};

struct Derived : Base {
    virtual void some_func(int) override;   // 錯誤格式：Derive::some_func並沒有override Base::some_func
    virtual void some_func(float) override; // OK：顯式改寫
};
編譯器會檢查基底類別是否存在一虛擬函數，與衍生類別中帶有聲明override的虛擬函數，有相同的函數簽名（signature）；若不存在，則會回報錯誤。
C++11也提供指示字final，用來避免類別被繼承，或是基底類別的函數被改寫：
struct Base1 final { };

struct Derived1 : Base1 { }; // 錯誤格式：class Base1已標明為final

struct Base2 {
    virtual void f() final;
};

struct Derived2 : Base2 {
    void f(); // 錯誤格式：Base2::f已標明為final
};
以上的範例中，virtual void f() final;聲明一新的虛擬函數，同時也表明禁止衍生函數改寫原虛擬函數。
override與final都不是語言關鍵字（keyword），只有在特定的位置才有特別含意，其他地方仍舊可以作為一般指示字（identifier）使用。
核心語言使用性的加強 > 空指標

早在1972年，C語言誕生的初期，常數0帶有常數及空指標的雙重身分。
C使用preprocessor macro NULL表示空指標，讓NULL及0分別代表空指標及常數0。
NULL可被定義為((void*)0)或是0。
C++並不採用C的規則，不允許將void*隱式轉換為其他型別的指標。為了使代碼char* c = NULL;能通過編譯，NULL只能定義為0。這樣的決定使得函數多載無法區分代碼的語意：
void foo(char *);
void foo(int);
void foo(nullptr_t);
C++建議NULL應當定義為0，所以foo(NULL);將會呼叫foo(int)，這並不是程序員想要的行為，也違反了代碼的直觀性。0的歧義在此處造成困擾。
C++11引入了新的關鍵字來代表空指標常數：nullptr，將空指標和整數0的概念拆開。
nullptr的型別為nullptr_t，能隱式轉換為任何指標或是成員指標的型別，也能和它們進行相等或不等的比較。而nullptr不能隱式轉換為整數，也不能和整數做比較。
為了向下相容，0仍可代表空指標常數。
char* pc = nullptr;     // OK
int * pi = nullptr;     // OK
int    i = nullptr;     // error
bool   b = nullptr;     // OK

foo(pc);           // 调用foo(char *), 而不是 foo(int);
foo(nullptr);      // 调用foo(nullptr_t);
值得注意的是上面的 foo(nullptr_t) 被隐式转换为 foo(char *) 只会发生在该函数不存在其它的指针类型重载（比如 foo(int*), foo(MyClass*)等）时候，否则就会产生歧义错误（可以通过显示声明一个 foo(nullptr_t) 来消除该歧义）。
在C++11的标准类型头文件中，nullptr_t 类型应该被声明为：
typedef decltype(nullptr) nullptr_t;
而不是：
typedef int nullptr_t; //  C++11之前的标准需要定义 NULL 为 0
      typedef void *nullptr_t; // ANSI C 定义 NULL 为 ((void*)0)
核心語言使用性的加強 > 強型別列舉

在C++03中，列舉型別不是型別安全的。列舉型別被視為整數，这使得两种不同的列舉型別之間可以進行比較。C++03唯一提供的安全機制是一个整数或一个枚举型值不能隱式轉換到另一个列舉別型。此外，列舉所使用整數型別及其大小都由實作方法定義，皆無法明確指定。最後，列舉的名稱全數暴露於枚举类型的作用域中，因此兩個不同的列舉，不可以有相同的列舉名。（好比 enum Side{ Right, Left }; 和 enum Thing{ Wrong, Right }; 不能一起使用。）
C++11引進了一種特別的"列舉類"，可以避免上述的問題。使用enum class的語法來宣告：
enum class myEnumeration
{
  Val1,
  Val2,
  Val3 = 100,
  Val4 /* = 101 */,
};
此種列舉為型別安全的。列舉類別不能隱式地轉換為整數；也無法與整數數值做比較。（表示式Enumeration::Val4 == 101會觸發編譯期錯誤）。
列舉類別所使用型別必須顯式指定。在上面的範例中，使用的是預設型別int，但也可以指定其他型別：
enum class Enum2 : unsigned int {Val1, Val2};
列舉類別的作用域（scoping）不包含枚举值的名字。使用枚举值的名字，必須明確限定于其所屬的枚举类型。例如，前述列舉類別Enum2，Enum2::Val1是有意義的表示法，而單獨的Val1則否。
此外，C++11允許為傳統的列舉指定使用型別：
enum Enum3 : unsigned long {Val1 = 1, Val2};
列舉名Val1定義於Enum3的列舉範圍中（Enum3::Val1），但為了向后相容性，
Val1仍然可以於所属枚举类型所在的作用域中單獨使用。
在C++11中，列舉類別的前置聲明（forward declaration）也是可行的，只要使用可指定型別的新式列舉即可。之前的C++無法寫出列舉的前置聲明，是由於無法確定列舉變數所佔的空間大小，C++11解決了這個問題：
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
核心語言使用性的加強 > 角括號

C++03的剖析器一律將">>"視為右移運算子。但在嵌套樣板定義式中，絕大多數的場合其實都代表兩個連續右角括號。為了避免剖析器誤判，撰碼時不能把右角括號連著寫。
C++11變更了剖析器的解讀規則；當遇到連續的右角括號時，会在合理的情况下将右尖括號解析為樣板引數的結束符號。给使用>,>=,>>的表达式加上圆括号，可以避免其与圆括号外部的左尖括号相匹配：
template<bool bTest> class SomeType;
std::vector<SomeType<1>2>> x1;   // 解讀為std::vector of "SomeType<true> 2>"，
                                 // 非法的表示式，整數1被轉換為bool型別true
std::vector<SomeType<(1>2)>> x1; // 解讀為std::vector of "SomeType<false>",
                                 // 合法的C++11表示式，(1>2)被轉換為bool型別false
核心語言使用性的加強 > 顯式型別轉換子

C++98引入了關鍵字explicit来避免用戶自定的單引數建構式被當成隱式型別轉換子。但是，却没有限制明确定义的类型转换函数。比方說，一個smart pointer類別具有一個operator bool()，被定義成若該smart pointer不为null則傳回true，反之傳回false。遇到這樣的代碼時：if(smart_ptr_variable)，編譯器可以藉由operator bool()隱式轉換成布林值，和测试原生指標的方法一樣。但是這類隱式轉換同樣也會發生在非預期之處。由於C++的bool型別也是算术型別，能隱式換為整數甚至是浮點數。拿物件轉換出的布林值做布林運算以外的數學運算，往往不是程序員想要的。
在C++11中，關鍵字explicit修飾符也能套用到型別轉換函数上。如同建構式一樣，它能避免型別轉換函数被隱式轉換調用。但C++11特別指定，在if條件式、迴圈、邏輯運算等需要布林值的地方，将其作为显式类型转换，因此即使对应的类型转换函数被explicit修饰也可以调用。这主要为了解决safe bool（页面存档备份，存于）问题。
核心語言使用性的加強 > 模板的別名

在進入這個主題之前，各位應該先弄清楚「模板」和「型別」本質上的不同。class template (類別模板，是模板)是用來產生template class（模板類別，是型別）。在C++03中，typedef可定義模板類別一個新的型別名稱，但是不能夠使用typedef來定義模板的別名。舉例來說：
template< typename first, typename second, int third>
class SomeType;

template< typename second>
typedef SomeType<OtherType, second, 5> TypedefName; // 在C++03是不合法的
這不能夠通過編譯。
為了定義模板的別名，C++11將會增加以下的語法：
template< typename first, typename second, int third>
class SomeType;

template< typename second>
using TypedefName = SomeType<OtherType, second, 5>;
using也能在C++11中定義一般型別的別名，等同typedef：
typedef void (*PFD)(double);		// 傳統語法
using PFD = void (*)(double);		// 新增語法
核心語言使用性的加強 > 模板参数的缺省值

C++98支持类模板的模板参数默认值，不支持函数模板的模板参数默认值。C++11可以支持函数模板的模板参数默认值。类模板的模板参数默认值需要从右到左依次出现；函数模板的默认模板参数没有此约束。
void DefParm(int m = 3) {} // c++98编译通过，c++11编译通过

template <typename T = int>
class DefClass {};        // c++98编译通过，c++11编译通过

template <typename T = int>
void DefTempParm() {};    // c++98编译失败，c++11编译通过


//以下为C++11编译：
template <typename T1, typename T2 = int>
class DefClass1 {};

template <typename T1 = int, typename T2>
class DefClass2 {};  // ERROR: 无法通过编译：因为模板参数的默认值没有遵循“由右往左”的规则

template <typename T, int i = 0>
class DefClass3 {};

template <int i = 0, typename T>
class DefClass4 {};  // ERROR: 无法通过编译：因为模板参数的默认值没有遵循“由右往左”的规则

template <typename T1 = int, typename T2>
void DefFunc1(T1 a, T2 b) {}; // OK 函数模板不用遵循“由右往左”的规则

template <int i = 0, typename T>
void DefFunc2(T a) {};  // OK 函数模板不用遵循“由右往左”的规则

//通常，如果能够从函数实参中推导出类型的话，那么默认模板参数就不会被使用，反之，默认模板参数则可能会被使用：
template <class T, class U = double>
void f(T t = 0, U u = 0) {};
void g() 
{
    f(1, 'c'); // f<int, char>(1, 'c') 
    f(1);      // f<int, double>(1, 0), 使用了默认模板参数double
    f();       // 错误: T无法被推导出来
    f<int>();  // f<int, double>(0, 0), 使用了默认模板参数double
    f<int, char>(); // f<int, char>(0, 0)
}