VS2022中emplace_back结合initializer_list编译报错问题咨询
VS2022编译初始化列表代码报错的原因及解决办法
你的代码在GCC能编译但VS2022报错,核心原因是两种编译器对C++语法的兼容性策略不同:
- 你写的
(std::initializer_list<int>) { 5, 6 }属于GCC的非标准语法扩展,C标准里并没有定义这种带括号的类型后直接跟初始化列表的显式转换写法。GCC为了方便开发者额外支持了这个特性,但MSVC(VS2022的编译器)严格遵循C标准,不认可这种语法,所以抛出C4576错误。 - 注释行也报错是因为MSVC的语法检查会扫描注释中的代码片段,哪怕是注释内容,只要包含不符合标准的语法,也会触发错误提示。
解决这个问题很简单,改用标准兼容的写法即可,推荐两种方式:
- 直接用花括号初始化,
emplace_back会自动推导参数类型:
#include <vector> #include <initializer_list> int main() { std::vector<std::vector<int>> vec; vec.emplace_back({5, 6}); return 0; }
- 使用
static_cast进行标准的显式类型转换:
#include <vector> #include <initializer_list> int main() { std::vector<std::vector<int>> vec; vec.emplace_back(static_cast<std::initializer_list<int>>({5, 6})); return 0; }
内容的提问来源于stack exchange,提问作者Yousef Irshaid
相关产品推荐
相关产品推荐

