if/switch语句初始化功能
基础介绍
这个特性是在c++17版本引入的,在这之前是不允许在if语句或者switch语句中使用赋值语句,不仅仅是if语句和switch语句,包括lambda表达式在c++17版本也支持类在捕获表达式中支持赋值操作。言归正传,下面阐述这个特性的基本语法:
// 传统写法
T value = getValue();
if (value) {// 使用 value
}// C++17 新语法
if (T value = getValue(); value) {// 使用 value
}
通过上面的基本语法可以看到在c++17之前value的获取必须在if之前完成,如果将像c++17版本的写法,编译器会报错。
作用域控制
这个特性很简单,不需要过多的讲解,但是有一点需要注意,即如果在if语句或者switch语句中采用了初始化的新特性,那这个符号作用是什么呢?直接给出答案:
- 对于if语句,初始化的变量的作用域是整个if/else语句块,在外部无法使用这个变量,谨记else这个变量有效的,这个很容易搞错
- 对于switch语句,初始化的变量作用域是整个switch语句块,在swtich语句块的外部无法访问这个变量
使用建议
- 仅建议如果初始化过程简单可以考虑采用这种方式,如果初始化逻辑特别复杂,不建议使用该特性。
- 多重嵌套的if语句也不建议使用该特性,请看下面的例子
// 不推荐
if (auto x = foo(); x > 0) {if (auto y = bar(); y > 0) {if (auto z = baz(); z > 0) {// ...}}
}