调用函数时切换“控制转移绕过初始化:”
当我尝试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 }