返回介绍

8.7 条件的显式测试

发布于 2024-08-19 12:44:36 字数 4713 浏览 0 评论 0 收藏 0

我认为很多小的提案是危险的,即使每个都能帮助一些人。考虑为条件增加显式测试的能力 [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 时它会崩溃,而最初的代码不会。无论我们从中能得到什么好处,这样的重写可能带来新的错误和混乱。

为了通用,显式测试也可以用在 switchwhile 条件中。在 C++20 中,这一机制被进一步扩展到可以在范围 for 语句中包含初始化 [Köppe 2017c]。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文