样本代码:
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:
pMoreSettingsButton所指向的值只赋值一次,将其标记为指向const的指针(con.4)。
我使用的是Visual 2022预览6,我已经在其他类文件中注意到了这一点。这是我做错了什么,还是我应该向微软报告一个bug?
发布于 2021-10-23 16:52:06
以下程序抓住了问题的要点,而不失去一般性:
int* foo() { return nullptr; }
int main() {
const auto p = foo(); // C26462
}它生成一个C26462诊断,并继续提供一个解决方案:
将其标记为指向
const的指针
您可能会认为const auto确实做到了这一点,但事实并非如此。
编译器需要推断出用什么代替auto。它查看了foo()的函数声明,并明确地得出结论,auto应该被int*替代。那部分不是很有趣。这里唯一令人惊讶的可能是,C++走的是最不意外的路线。
因此,如果auto被int*取代,那么很明显,const auto应该像诊断消息所建议的那样,转换为const int*,即指向const的指针。为什么代码分析器还在抱怨呢?
嗯,在设计一种编程语言时,选择最少的惊喜并不是唯一的选择,而且C++也不羞于积极探索这个设计空间!const关键字的位置当然属于该类别:
广义地说,const适用于它左边的任何东西。这很简单,表面上是如此,非常不像C++。当然,还有一个特殊的规则,它经常出现在应用程序中,以至于我们几乎完全忘记了它是特别的:如果const的左边没有任何东西,那么它就会被应用到它右边的任何东西上。对于值来说,这并不重要:const int和int 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甚至有一条特殊的规则。
https://stackoverflow.com/questions/69686896
复制相似问题