无法删除代码分析警告 C26462

Can't remove code analysis warning C26462

示例代码:

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();
    }
}

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

它仍然说:

C26462: The value pointed to by pMoreSettingsButton is assigned only once, mark it as a pointer to const (con.4).

我正在使用 Visual Studio 2022 预览版 6,我在其他 class 文件中注意到了这一点。是我做错了什么还是我应该向 Microsoft 解决的错误?

以下程序在不失一般性的情况下抓住了问题的要点:

int* foo() { return nullptr; }

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

它会生成 C26462 诊断信息,并继续提供解决方案:

mark it as a pointer to const

您可能认为 const auto 正是这样做的,但事实并非如此。

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

那么,如果 auto 被替换为 int*,显然 const auto 应该变成 const int*,即指向 [=11] 的指针=],正如诊断信息所建议的那样。为什么代码分析器还在抱怨?

好吧,在设计编程语言时,采取最不意外的方式并不是 唯一的 选项,而且 C++ 并不羞于积极探索 那个设计space,也是! const 关键字的位置肯定属于该类别:

从广义上讲,const 适用于紧靠其左侧的任何内容。这很简单,看似如此,与 C++ 非常不同。当然,还有一个特殊的规则,它的应用如此频繁,以至于我们几乎完全忘记了它的特殊性:如果 const 左边没有任何东西,那么它会应用到它右边的任何东西.对于值,这无关紧要:const intint const 意思相同。但是,当涉及到指针时,事情就变得更有趣了。 const int*int* const 的意思完全不同。前者指定一个 "指向 const" 的指针,而后者是一个 ""=11=] 指针".

回到眼前的问题,const auto 被翻译成 auto const(通过特殊的 const 规则),最后 auto 被替换,生成 int* const(或 CWnd* const,如最初的问题陈述)。这是不是 “指向const”的指针。要解决此问题,您有两种选择:

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

无论如何,你应该考虑使用"consistent const", also referred to as "east const",忘记甚至还有一个特殊规则const