You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:32:31