首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法删除代码分析警告C26462

无法删除代码分析警告C26462
EN

Stack Overflow用户
提问于 2021-10-23 09:38:26
回答 1查看 130关注 0票数 1

样本代码:

代码语言:javascript
复制
void COptionsDlg::OnBnClickedButtonMoreSettings()
{
    CString strCaption = _T("");
    const auto pMoreSettingsButton = GetDlgItem(IDC_BUTTON_MORE_SETTINGS);

    if (pMoreSettingsButton == nullptr)
        return;

    pMoreSettingsButton->GetWindowText(strCaption);

    __pragma(warning(suppress:26414))
        auto pDlgOther = std::make_unique<COtherSettingsSheet>(strCaption);
    if (pDlgOther != nullptr)
    {
        pDlgOther->DoModal();
    }
}

为什么编译器仍然抱怨这一行:

它仍然说:

C26462pMoreSettingsButton所指向的值只赋值一次,将其标记为指向const的指针(con.4)。

我使用的是Visual 2022预览6,我已经在其他类文件中注意到了这一点。这是我做错了什么,还是我应该向微软报告一个bug?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-23 16:52:06

以下程序抓住了问题的要点,而不失去一般性:

代码语言:javascript
复制
int* foo() { return nullptr; }

int main() {
    const auto p = foo();  // C26462
}

它生成一个C26462诊断,并继续提供一个解决方案:

将其标记为指向const的指针

您可能会认为const auto确实做到了这一点,但事实并非如此。

编译器需要推断出用什么代替auto。它查看了foo()的函数声明,并明确地得出结论,auto应该被int*替代。那部分不是很有趣。这里唯一令人惊讶的可能是,C++走的是最不意外的路线。

因此,如果autoint*取代,那么很明显,const auto应该像诊断消息所建议的那样,转换为const int*,即指向const的指针。为什么代码分析器还在抱怨呢?

嗯,在设计一种编程语言时,选择最少的惊喜并不是唯一的选择,而且C++也不羞于积极探索这个设计空间!const关键字的位置当然属于该类别:

广义地说,const适用于它左边的任何东西。这很简单,表面上是如此,非常不像C++。当然,还有一个特殊的规则,它经常出现在应用程序中,以至于我们几乎完全忘记了它是特别的:如果const的左边没有任何东西,那么它就会被应用到它右边的任何东西上。对于值来说,这并不重要:const intint const意味着同样的事情。但是,当涉及到指针时,事情会变得更有趣。const int*int* const的意思完全不同。前者指定“指向const__的指针”,而后者指定为"__const指针“。

回到这里的直接问题,const auto被转换为auto const (通过特殊的const规则),最后auto被替换,生成int* const (或者像初始问题语句中的CWnd* const )。这是而不是,是“指向const__的指针”。要解决这个问题,您有两个选择:

  • 命名具体类型,即CWnd const*,或
  • auto解决其他问题,例如auto const* (注意导致编译器推断类型CWnd的尾随*,并允许您对切入点进行cv-限定)

无论哪种方式,您都应该考虑使用,而忘记了对于const甚至有一条特殊的规则。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69686896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档