为何GCC中std::vector两种初始化语法调用不同构造函数?
关于std::vector两种初始化语法的构造函数调用差异
基础类型的一致表现
当创建std::vector<int>时,两种初始化语法均会调用std::initializer_list构造函数:
std::vector<int> v1{1, 2, 3};std::vector<int> v2 = {1, 2, 3};
自定义可隐式转换类型的编译器差异
定义可从int隐式转换的结构体Imp后,不同编译器的表现出现分歧:
- 在GCC 14.2中:
std::vector<Imp> v3{1, 2, 3};仍调用initializer_list构造函数std::vector<Imp> v4 = {1, 2, 3};会调用vector(const int*, const int*)迭代器构造函数
- 在Clang、MSVC中:两种语法均调用
initializer_list构造函数
自定义模板与std::vector特化的测试对比
进一步测试得到以下结论:
- 自定义模板
Custom同时拥有initializer_list构造函数和迭代器构造函数时,两种初始化语法均优先调用initializer_list构造函数 - 特化
std::vector<Imp>同时提供上述两个构造函数时,={}语法会选择迭代器构造函数;仅提供单个构造函数时,两种语法无差异
性能差异观察
通过打印日志验证构造函数调用情况后,性能测试显示:GCC中使用={}语法初始化std::vector<string>的速度更快,推测这是GCC针对字符串字面量的专属优化,且仅作用于={}语法。
内容的提问来源于stack exchange,提问作者Josh Shields
相关产品推荐
相关产品推荐

