C++ 是一門極其龐大且細節豐富的語言,即使資深開發者也常發現未曾涉足的角落。本文整理了 15 個晦澀但極具啟發性的 C++ 特性,按難度由淺入深排序,助你拓寬語言視野。
ptr[3] 只是 *(ptr + 3) 的語法糖。因為加法交換律,3[ptr] 完全等價且合法。
std::string foo(std::string()); 被編譯器視為函數聲明(返回 std::string,參數為函數指標),而非物件構造。用雙重括號 std::string foo((std::string())); 消除歧義。
C++ 提供 and、or、not、bitand 等關鍵字替代 &&、||、!、& 等符號,適用於鍵盤缺乏特定符號的環境。
雖然標準禁止,但預處理器允許 #define private public 等惡作劇,甚至可用於繞過訪問控制(需謹慎,可能破壞 ABI 兼容性)。
在預先分配的記憶體上構造物件:new (ptr) T();。不分配記憶體,僅調用構造函數,適用於自定義分配器、避免記憶體碎片。
if (MouseEvent* m = dynamic_cast<MouseEvent*>(e)) 可在條件中聲明並初始化變量,作用域限於分支內。
C++11 允許 void foo() &(左值)與 void foo() &&(右值)重載,根據 this 的值類別選擇調用。
模板特化實現編譯期遞歸計算(如階乘、列表求和),屬於函數式編程範式,但編譯慢、難調試,慎用。
&Class::member 獲取成員指針,配合 .*、->* 操作符訪問。成員函數指針體積可能遠大於普通函數指針,涉及多重繼承、虛繼承時更複雜。
靜態成員函數可透過實例或類名調用:Foo::foo() 與 Foo().foo() 等價,便於將實例方法遷移為靜態方法。
前綴 operator++() 返回引用;後綴 operator++(int) 需虛擬 int 參數區分,返回舊值副本。
重載 ,、||、&& 會失去短路求值與左右求值順序保證,因它們變為普通函數調用。可濫用實現 Python 風格的 print 語句。
模板參數可為函數指標,編譯器可內聯調用,實現編譯期備忘錄等優化。
模板模板參數 template<typename> class Store 允許 CachedStore<NetworkStore, int> 而無需重複指定類型參數。
Class::Class() try : member(f()) {} catch(...){} 可捕獲初始化列表中的異常,語法不限於構造函數,適用於所有函數定義。