文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
8.7 条件的显式测试
我认为很多小的提案
是危险的,即使每个都能帮助一些人。考虑为条件增加显式测试的能力 [Köppe 2016b]:
if (auto p = f(y); p->m>0) {
// ...
}
p->m>0
是一个显式测试,它的意思是:
{
auto p = f(y);
if (p->m>0) {
// ...
}
}
这是对 C++98 里在条件里同时声明和测试的推广(§2.2.1):
if (auto pd = dynamic_cast<Derived*>(pb)) { // 如果 pd 指向 Derived 类型则为真
// ...
}
问题是这种推广是否足够明显和有用,值得作为提案引入。我的回答是否定的。然而,这是我被否决的一个例子(不是很罕见)。
我的观点是,显式测试最好体现在 if
语句中。那里更不容易被忽视,而且遵循常规有其好处,特别是对那些不仅仅使用 C++ 语言编程的人。另一方面,显式测试似乎在有的人那里很受欢迎,他们的代码设计成需要对每个函数的结果都做错误检查。我个人非常反感那种设计风格(§7.5)。
有些人为了用上新特性而积极地重写代码。我听说过好几个例子,有人一看到下面这样的代码:
if (auto p = f(y)) {
if (p->m>2) {
// ...
}
// ...
}
就立刻重写为这样:
if (auto p = f(y); p->m>2) {
// ...
}
并声称这样更优雅和简洁。自然,当 p==nullptr
时它会崩溃,而最初的代码不会。无论我们从中能得到什么好处,这样的重写可能带来新的错误和混乱。
为了通用,显式测试也可以用在 switch
和 while
条件中。在 C++20 中,这一机制被进一步扩展到可以在范围 for
语句中包含初始化 [Köppe 2017c]。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论