无法删除代码分析警告 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 int
和 int 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
。
示例代码:
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 toconst
(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 int
和 int 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
。