当调用一个函数时,切换“控制转移旁路初始化:”

我得到一个“转移控制旁路初始化:”错误时,我尝试建立以下交换机:

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
}

它与我调用我的枚举函数有关。如果不允许从交换机内调用函数,是否有解决此类问题的方法?

105926 次浏览

C + + 标准第6.6.4节:

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

C + + 标准第6.7节:

可以转换为 阻塞,但是 不是以一种绕过的方式 具有初始化 的声明 从一个点跳跃的程序 哪里有带自动的局部变量 存储持续时间不在 它在范围内的点是 除非变量具有 POD,否则格式不正确 类型(3.9) ,并且没有使用 初始化程序

强调是我加上去的。因为 switch实际上是 goto的伪装,所以您会遇到这种行为。要解决这个问题,如果必须使用 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中创建 windows vector来实现什么,所以你可能需要重新考虑你的设计。我在 windows中添加了一个 const限定符,因为它在你的示例中没有被修改。

一个开关本质上是一个 goto,也就是说,它是一个 goto到适当的标签。C + + 标准禁止 goto 绕过非 POD 对象的初始化。将向量声明放入大括号,就可以解决这个问题

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
}