C++17中如何在else-if中使用初始化器?
规范的C++17实现方式
当然有更简洁规范的写法啦!你完全不需要用lambda这种绕弯子的方式,只要把else if拆成else块包裹一个带初始化语句的if就行——这完全符合C++17的语法规则,而且可读性强得多:
if (cond1) { // 处理cond1为真的情况 } else { if (init; cond2) { // 这里可以直接使用init中声明的变量,逻辑和你想要的完全一致 } }
为什么原来的写法不行?
C++的语法规则里,else if本质上是else后面紧跟一个普通if语句,但标准并没有为else if提供直接支持初始化语句的语法(也就是else if (init; cond)是非法的)。不过把else和带初始化的if拆成独立的块,就完美规避了这个限制,同时保留了你需要的“在判断cond2前完成初始化,且初始化的变量能在cond2的判断块中使用”的核心需求。
对比你的lambda写法
你用lambda的方式虽然能实现功能,但存在几个明显的不足:
- 可读性差:其他开发者第一眼可能会困惑这个lambda的作用,增加了代码理解成本
- 语义冗余:明明用原生语法就能实现的逻辑,没必要额外引入lambda的函数调用逻辑(即使编译器大概率会优化掉这个调用,但从代码简洁性来说完全没必要)
内容的提问来源于stack exchange,提问作者user5406764
相关产品推荐
相关产品推荐

