vector> v1; // OK C++11 起 vector
> v2; // C++98 風格(需空格避免 >> 被解析為移位)
nullptr 類型為 std::nullptr_t,可隱式轉換為任意指針類型,不會 轉換為整數,解決 NULL/0 重載歧義。
void f(int); void f(void*); void f(nullptr_t); f(0); // 調用 f(int) ❌ f(NULL); // 調用 f(int) ❌ f(nullptr); // 調用 f(void*) ✅ f((void*)0); // 調用 f(void*) ✅
auto x = 10; // int auto y = 3.14; // double auto z = f(); // 推導 f() 返回類型 // auto a; // 錯誤:必須初始化
int i{42}; vector v{1,2,3}; int i{3.14}; 編譯錯誤initializer_list 構造函數優先級最高class P {
P(int, int) { cout << "1"; }
P(initializer_list) { cout << "2"; }
};
P p1(1,2); // 輸出 1
P p2{1,2}; // 輸出 2(initializer_list 優先)
P p3{1,2,3};// 輸出 2
for (auto& x : {1, 2, 3}) cout << x << ' '; // 1 2 3
for (auto& [k, v] : map) { ... } // C++17 結構化綁定
class People {
People() { cout << "默認構造"; }
People(int) { cout << "參數構造"; }
People(const People&) { cout << "拷貝構造"; }
People(People&&) { cout << "移動構造"; } // 右值引用
People& operator=(const People&) { cout << "拷貝賦值"; return *this; }
};
vector v;
People p(100);
v.push_back(move(p)); // 輸出:移動構造
// move 將 lvalue 轉為 xvalue(將亡值),觸發移動構造
| 特性 | C++98 | C++11/14/17 |
|---|---|---|
| 空指針 | NULL / 0 | nullptr |
| 類型推導 | 無 | auto / decltype |
| 初始化 | (), = | {} 統一初始化 |
| 循環 | 迭代器手寫 | 範圍 for |
| 資源轉移 | 拷貝/交換 | 移動語義 (move) |
| 智能指針 | auto_ptr | unique_ptr/shared_ptr |
std::move、返回值優化 (RVO/NRVO)make_unique, make_shared, 容器