C++11(原 C++0x)是現代 C++ 里程碑,引入 lambda、類型推導、智能指針、移動語義、線程庫等改變編程範式的特性。本文精選最高頻特性,助你快速上手。
auto x = 42; // int auto p = new Foo(); // Foo* auto it = v.begin(); // vector::iterator decltype(x) y = x; // int y = x; // 尾置返回類型配合 decltype template<typename Creator> auto make(Creator c) -> decltype(c()) { return c(); }
void f(int); void f(int*); f(0); // 調用 f(int) — 二義性 f(nullptr); // 調用 f(int*) — 明確
for (auto& x : vec) x *= 2;
for (const auto& [k, v] : map) { ... } // C++17 結構化綁定
[捕獲列表](參數) mutable -> 返回類型 { 函數體 }
int a=1,b=2;
auto f = [=](int x){ return x+a+b; }; // 值捕獲所有
auto g = [&](int x){ a=x; return a; }; // 引用捕獲所有
template<typename... Args>
void print(Args... args) { (cout << ... << args) << '\n'; } // C++17 折疊表達式
// C++11 遞歸版
void print() {}
template<typename T, typename... Rest>
void print(T first, Rest... rest) { cout << first << ' '; print(rest...); }
int a[] = {1,2,3};
vector v{1,2,3};
map m{{1,"a"},{2,"b"}};
class String {
char* data;
public:
String(String&& rhs) noexcept : data(rhs.data) { rhs.data = nullptr; } // 移動構造
String& operator=(String&& rhs) noexcept { // 移動賦值
if (this != &rhs) { delete[] data; data = rhs.data; rhs.data = nullptr; }
return *this;
}
};
unique_ptrp1(new Foo); shared_ptr p2 = make_shared (); // 推薦 weak_ptr wp = p2; // 打破循環引用
thread t([]{ cout << "Hello thread\n"; });
t.join();
mutex m; lock_guard lg(m); // RAII 鎖