C++11 標準的發布被廣泛視為現代 C++ 時代的起點。它不僅修補了 C++03 的諸多缺憾,更引入了讓語言「煥然一新」的核心機制:自動類型推導、移動語義、Lambda 表達式、智能指標、標準線程庫等。本文系統梳理 C++11 的關鍵特性,並輔以實戰代碼示例,助你快速掌握現代 C++ 精髓。
auto 讓編譯器根據初始化表達式自動推導變量類型,極大簡化了迭代器、模板代碼的編寫。需注意:auto 預設推導為值類型,若需引用或指針,必須顯式添加 & 或 *。
auto str = "sissie"; // const char*
auto& ref = str; // const char*&
auto* ptr = &str; // const char**
decltype 則用於獲取表達式的類型,不執行表達式,常用於模板返回類型推導:
int arr[10];
decltype(arr) arr2; // int arr2[10];
新語法 auto func() -> return_type 解決了模板函數返回類型依賴參數的難題。std::initializer_list 配合花括號 {},實現了容器、數組、結構體的統一初始化:
std::vector<int> v = {1, 2, 3, 4, 5};
std::map<int, std::string> m = {{1, "C++"}, {2, "Java"}};
範圍 for 循環 for (auto& x : container) 取代了傳統迭代器寫法,更安全、可讀性更強。nullptr 作為強類型空指針常量,徹底取代 NULL/0,避免了重載決議歧義。
Lambda 讓匿名函數對象的創建變得輕而易舉,完美契合 STL 算法。其完整語法包含捕獲列表、參數、可變性、異常規範、返回類型與函數體。
std::vector<int> v = {1, 2, 3, 4, 5};
int sum = 0;
std::for_each(v.begin(), v.end(), [&sum](int x){ sum += x; }); // 值捕獲 sum
// mutable 允許修改值捕獲的變量
size_t i = 42;
auto f = [i]() mutable { return ++i; }; // f() 返回 43, 44...
捕獲模式:[=] 值捕獲所有,[&] 引用捕獲所有,[this] 捕獲 this 指針,[a, &b] 混合模式。
std::string name = "default";。C++11 引入 T&& 右值引用,區分「有名字的持久對象」(左值)與「即將銷毀的臨時對象」(右值)。移動構造/賦值通過「竊取」資源指針而非深拷貝,實現 O(1) 資源轉移。
class Buffer {
char* data_;
size_t size_;
public:
Buffer(Buffer&& other) noexcept // 移動構造
: data_(other.data_), size_(other.size_) {
other.data_ = nullptr; other.size_ = 0;
}
Buffer& operator=(Buffer&& other) noexcept { ... }
};
std::move 將左值強制轉為右值引用,啟用移動語義。警告:移動後源對象進入「已移動」狀態,僅能安全析構或重新賦值,不可繼續使用。
list 更省內存,適合只需順序遍歷的場景。unordered_map/set/multimap/multiset 基於哈希表,查找/插入/刪除平均 O(1),不保證元素順序,高頻查找場景首選。| 類型 | 所有權語義 | 適用場景 |
|---|---|---|
unique_ptr | 獨佔所有權,不可複製,可移動 | 單一所有者,作用域結束自動釋放 |
shared_ptr | 共享所有權,引用計數 | 多主人共享,最後一個釋放 |
weak_ptr | 弱引用,不增加計數 | 打破循環引用,緩存觀察者 |
auto p = std::make_unique<Widget>(); // C++14, C++11 用 new Widget
std::shared_ptr<Widget> sp = std::make_shared<Widget>(); // 推薦,單次分配
std::weak_ptr<Widget> wp(sp); // 不影響生命周期
<regex> 提供 std::regex、std::smatch、std::regex_search/match/replace 及迭代器,支援 ECMAScript 語法。注意:regex_match 整串匹配,regex_search 子串搜尋。
<thread>、<mutex>、<condition_variable>、<atomic> 構建了完整的並發基礎設施。
join() 或 detach()。mutex、recursive_mutex、timed_mutex、recursive_timed_mutex。lock_guard(簡單作用域鎖)、unique_lock(可延遲鎖定、轉移所有權、配合 condition_variable)。wait/notify_one/notify_all 實現線程協作。std::atomic<T> 提供無鎖線程安全訪問。分離「引擎」(產生均勻隨機位模式)與「分布」(映射到特定統計分布)。推薦 std::mt19937_64 (梅森旋轉) + std::random_device 種子。
std::random_device rd;
std::mt19937_64 gen(rd());
std::uniform_int_distribution<> dis(1, 100);
std::normal_distribution<> nd(0.0, 1.0); // 正態分布
C++11 不只是語法擴充,更是編程範式的轉折:移動語義重塑資源管理,Lambda 與 auto 釋放泛型編程表達力,標準線程庫統一跨平台並發模型。掌握這些特性,是邁向高效、安全、可維護現代 C++ 代碼的必經之路。