MSVC C++20中IIFE与折叠表达式引发未初始化变量错误咨询
MSVC C++20下参数包与IIFE结合引发未初始化变量错误的问题
在MSVC C++20环境中使用立即执行函数表达式(IIFE)和参数包时,出现了不符合预期的编译错误。以下是最小复现代码:
#include <functional> #include <iostream> template <typename... Ts> struct Foo { std::function<void(Ts...)> fnc = {}; Foo() {} Foo(const Foo&) : fnc( [](Ts... ts) { bool test = ([&ts](){ return true; }() && ...); std::cout << test << std::endl; } ) {} }; int main() { Foo<int> f; Foo<int> f2 = f; return 0; }
编译时触发如下错误:
error C4700 uninitialized local variable 'test' used fatal error LNK1257: code generation failed
更奇怪的是,将拷贝构造函数设为默认构造函数后,错误会完全消失。
问题分析
这是MSVC编译器的bug,原因如下:
- 代码中
bool test = ([&ts](){ return true; }() && ...);通过折叠表达式对每个参数对应的IIFE返回值做逻辑与运算,结果会直接初始化test变量,语法和语义均符合C++20标准,不存在未初始化的情况。 - 仅当自定义拷贝构造函数中包含参数包+lambda+IIFE+折叠表达式的组合时触发错误,默认拷贝构造函数正常,说明编译器在处理该组合场景时出现了逻辑误判,错误标记
test未初始化。
临时解决办法
可以通过调整代码写法绕过这个bug:
- 显式先初始化
test再赋值:bool test = true; test = ([&ts](){ return true; }() && ...); - 简化折叠表达式逻辑,比如直接用
bool test = true;(如果实际逻辑允许),或者替换IIFE的写法。
长远来看,建议升级到最新版本的MSVC编译器,或向微软官方提交该bug报告。
内容的提问来源于stack exchange,提问作者BubLblckZ
相关产品推荐
相关产品推荐

