Contents

Brace or Parentheses Initialization in Modern C++

Contents
  • template 設計 interface 要特別小心 initializer_list,variadic template 是更好的選項
  • 設計 ctor 時,要考慮 () {} 的行為是否一樣
  • 使用 {} 來當作預設初始化
    • 優點:
      • 可以避免 narrowing convertion
      • 避免 () 造成和 function 宣告語意重疊的問題
      • uncopyable object 可以用此初始化,例如 std::atomic<int> ai1{ 0 };
    • 注意:
      • 不能使用 auto var{1, 2, 3};
      • 當參數有 initializer_list,預設會使用 initializer_list,例如: Widget 的 ctor 有 Widget(std::initializer_list<long double> il);Widget(int i, bool b);,如果呼叫 Widget w2{10, true};,會強制轉型使用前者的 ctor
      • 如果 ctor 有 initializer_list,但會造成 narrowing convertion (int 或 float 轉 bool),則會 compile error
      • 如果 ctor 有 initializer_list,但無法轉型 (int 轉 string),則會考慮其他非 initializer_list 的 ctor
      • 當使用 Widget w{}; 是呼叫 default ctor Widget ();
      • 必要時還是需要 () 初始化,例如 vector<int> v(10,10);





Комментарии