调用函数时切换“控制转移绕过初始化:”

当我尝试build立下面的开关时,我得到了一个“转移控制绕过初始化:”错误:

switch (retrycancel) { case 4: //The user pressed RETRY //Enumerate all visible windows and store handle and caption in "windows" std::vector<MainHandles::window_data> windows = MainHandles().enum_windows().get_results(); break; case 2: //code } 

这与我的枚举函数调用有关。 如果不允许从交换机中调用某个function,有没有解决这种问题的方法?

C ++标准的第6.6.4节:

goto语句无条件地将控制转移到由标识符标记的语句。 标识符应为位于当前函数中的标签(6.1)。

C ++标准的第6.7节:

可以将其转换为块,但不能以绕过具有初始化的声明的方式 。 从具有自动存储持续时间的局部variables不在范围内的点跳转到在范围内的点跳转的程序是不合格的,除非该variables具有PODtypes(3.9),并且没有初始化程序

强调的重点 。 由于switch真的是变相,你遇到这种行为。 要解决这个问题,如果您必须使用switch ,请添加大括号

 switch (retrycancel) { case 4: { const std::vector<MainHandles::window_data> windows( MainHandles().enum_windows().get_results() ); break; } case 2: //code } 

或重构成if / else

 if (retrycancel == 4) { const std::vector<MainHandles::window_data> windows( MainHandles().enum_windows().get_results() ); } else if (retrycancel == 2) // code } else { ... } 

虽然我不明白你希望在switch内部创buildwindows vector所能达到的目标,所以你可能想重新考虑一下你的devise。 注意我在windows添加了一个const修饰符,因为它在你的例子中没有修改。

一个开关本质上是一个转换,也就是goto合适的标签。 C ++标准禁止goto绕过非POD对象的初始化。 将vector声明放在大括号中,它将解决问题

 switch (retrycancel) { case 4: //The user pressed RETRY { std::vector<MainHandles::window_data> windows = MainHandles().enum_windows().get_results(); //Enumerate all visible windows and store handle and caption in "windows" break; } case 2: //code }