知识卡片
auto的花括号例外
内容
本书按早期 C++11⁄14 规则解释 auto 的花括号例外:复制列表初始化如 auto x = {1,2} 会推导为 initializer_list;普通模板推导不会从裸列表得到类型。不要把这条结论泛化到所有版本的直接列表初始化;接口审查要同时记录标准模式和初始化语法。
参考来源
- 位置:《Effective Modern C++》第1章《类型推导》,条款二:理解 auto 类型推导(源文件:_epub-src/EPUB/text/ch002.xhtml)
- 结论依据:原文对比 auto 与模板的列表推导规则;本卡保留该例外并限定早期标准语境,不泛化直接列表初始化。
- 原始内容:auto 类型推导通常和模板类型推导相同,但是 auto 类型推导假定花括号初始化代表 std::initializer_list ,而模板类型推导不这样做 在C++14中 auto 允许出现在函数返回值或者 lambda 函数形参中,但是它的工作机制是模板类型推导那一套方案,而不是 auto 类型推导
- 版本核验:2026-09-08 查阅[作者勘误](https://www.aristeia.com/BookErrata/emc%2B%2B-errata.html)及[N3922](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3922.html):直接列表初始化单元素规则已有修正,复制列表与直接列表不可混同。