知识卡片
花括号不总安全
内容
花括号初始化能拒绝窄化并避免把对象声明误解析为函数声明,但构造重载会强烈偏向 initializer_list。vector 的花括号可能表示元素列表,小括号则可能表示数量和值。初始化方式会改变行为,应成为接口契约的一部分。
参考来源
- 位置:《Effective Modern C++》第3章《移步现代C++》,条款七:区别使用 () 和 {} 创建对象(源文件:_epub-src/EPUB/text/ch004.xhtml)
- 结论依据:原文比较括号语法、窄化和列表构造偏好,说明同样参数可能选择不同构造含义。
- 原始内容:括号初始化是最广泛使用的初始化语法,它防止变窄转换,并且对于C++最令人头疼的解析有天生的免疫性 在构造函数重载决议中,括号初始化尽最大可能与 std::initializer_list 参数匹配,即便其他构造函数看起来是更好的选择 对于数值类型的 std::vector 来说使用花括号初始化和小括号初始化会造成巨大的不同 在模板类选择使用小括号初始化或使用花括号初始化创建对象是一个挑战。