查看原文
其他

C++17 常用新特性(一)---带初始化的 if 和 switch 语句

CPP开发者 2023-07-27

The following article is from CPP开发前沿 Author 龙小

早在2016-03-14,Thomas Köppe 在https://wg21.link/p0305r0中就提出了在if和switch使用初始化语句,使用时的代码示例如下:
if (int s = check(); s != 0) {return s;}

在上面的代码中,初始化语句是int s = check()。s的生命周期是整个if语句,这里也包含else语句。

1 带初始化的if语句

if初始化语句中定义的变量在整个if语句范围内都是生效的。包括else if和else语句。例如:

std::ofstream getLogStrm(){ std::ofstream file3("c:\\x.123"); return file3;};std::map<int,int> coll;int main(){ if (std::ofstream strm = getLogStrm(); coll.empty()) { strm << "<no data>\n"; } else { for (const auto& elem : coll) { strm << elem.first << '\n'; }    } return 0;}

如上,if语句中的strm的生命周期在执行完if语句后就被析构了。在来看下面这段代码。这段代码来源于https://wg21.link/p0305r0。如下:

if (std::lock_guard<std::mutex> lk(mx_); v.empty()) { v.push_back(kInitialValue);}

上面的这段代码转换成旧式代码如下:

std::lock_guard<std::mutex> lk(mx_)if(v.empty(){ v.push_back(kInitialValue);}

可以看出,两段代码几乎没有什么区别,唯一的差别可能是lock_guard定义的位置不一样。

同样,为了让lock_guard有效,就需要给它定义一个变量。如果没有定义变量那么它在创建后就会立即被销毁。如下:

if (std::lock_guard<std::mutex>{mx_};  v.empty()) //锁已经被销毁 { v.push_back(kInitialValue);  }

上面的代码中,锁被定义后就立即被销毁,在执行后面的语句时实际上是没有加锁的。

同样,在if初始化语句中也可以初始化多个变量,如:

if (int x = qqq1(), int y = qqq2(); x != y) { std::cout << "return values " << x << " and " << y << "differ\n";}

最后,还可以在if语句中对map进行插入操作,并对插入结果进行检查,代码如下:

int main(){ std::map<char,int> mymap; mymap.insert ({'a',100}); if(auto [pos,ok] = mymap.insert({'a',100});!ok){ auto [key,var] = *pos; std::cout << "already there: " << key << '\n'; } return 0;}

2 带初始化的switch语句

在switch语句中使用初始化语句和if中相似,如下代码,可以在switch中获取一个实例,然后根据实例的状态做不同的处理。代码如下:

switch (Foo x = make_foo(); x.status()) { default: /* ... */ case Foo::FINE: /* ... */ case Foo::GOOD: /* ... */ case Foo::NEAT: /* ... */}



- EOF -

推荐阅读  点击标题可跳转

1、C++ 并发编程(C++11 到 C++17 )

2、C++17之std::optional

3、C++17 折叠表达式


关注『CPP开发者』

看精选C++技术文章 . 加C++开发者专属圈子

点赞和在看就是最大的支持❤️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存