case的本质:
case 只是一个标签(label),并不会隐式创建新的作用域。(想象成一个不自动关门的“标记”)
如果你在一个 case的标记下面,直接写一句 auto it = ...或 int x = 0来声明并初始化一个变量,编译器就会报错(提示:“跨越初始化”)。它怕的是:如果程序执行时,从别的地方“跳”到了这个 case标记的下一行,那就跳过了你初始化变量的那一步。一个变量没初始化就被用,是很危险的,所以编译器干脆禁止你这么做。
正确用法
case 2: { // 加上左大括号,创建一个小房间
auto it = students.find(name); // 现在在这里声明变量就安全了
// ... 其他代码
break;
} // 右大括号结束这个小房间
