调用函数时,开关“控制转移绕过”的初始化

当我尝试构建以下开关时,我得到一个“控制转移绕过初始化:”错误:

开关(重试取消)
{
案例4://用户按了重试
//枚举所有可见窗口,并在“窗口”中存储句柄和标题
std::vector<MainHandles::window_data>windows=MainHandles().enum_windows().get_results();
打破
案例2:
//代码
}

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

第6节的C++标准:

goto语句是无条件的
将控制转移到语句
由标识符标记。这个
标识符应为标签(6.1)
位于当前功能中

第6.7节C++标准:

有可能转移到一个
块,但不是以绕过的方式
带有初始化的声明
。A.
从一点跳转的程序
其中一个局部变量具有自动
存储持续时间不在的范围内
它在范围内的点是
除非变量具有POD,否则格式不正确
类型(3.9),并且声明时没有
初始值设定项

强调由我添加。由于switch实际上是伪装的goto,因此您会遇到这种行为。要解决此问题,如果必须使用开关,请添加大括号

开关(重试取消)
{
案例4:
{
const std::vector<MainHandles::window_data>windows(
MainHandles().enum_windows().get_results()
);
打破
}
案例2:
//代码
}

或者重构为if/else

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

虽然我不清楚在开关内创建窗口向量希望实现什么,因此您可能需要重新考虑您的设计注意我在windows中添加了一个const限定符,因为在您的示例中它没有被修改

发表评论