C++ 初始化陷阱
更新时间:2026-10-01。初始化语法多且含义微妙,是隐蔽 bug 高发区。
一、统一用 {} 的理由
Widget w(); 会被解析成函数声明(most vexing parse),Widget w{}; 才是对象;花括号初始化还禁止 int x{3.5} 这类窄化。
二、细节
成员按声明顺序而非初始化列表顺序构造;聚合体可用花括号逐成员初始化;标量若不显式初始化可能是不确定值。带 std::initializer_list 的容器,{} 优先走列表构造(vector<int> v(3) 是 3 个 0,v{3} 是一个元素 3)。

常见坑
- 函数声明被当成构造。
- 初始化列表顺序与成员声明不一致触发告警/-Werror。
- 依赖 initializer_list 却想传大小参数。
小结
总结
C++ 初始化方式多且微妙,实践上应优先用花括号 {} 列表初始化:它能解决 most vexing parse(T w(); 会被当成函数声明而 T w{} 才是对象)并禁止窄化转换;其余要点是成员严格按声明顺序而非初始化列表顺序构造、标量不显式初始化即不确定值(UB)、带 initializer_list 的容器中 {} 优先走列表构造(vector<int> v(3) 是 3 个 0 而 v{3} 是一个元素),并用 explicit 阻止意外的隐式转换。