C26492 不要使用“const_cast”来丢弃 const 或 volatile(type.3)
C26492 Don't use `const_cast` to cast away const or volatile (type.3)
这里有一个关于不使用 const_cast
的有趣讨论,我们鼓励您使用 mutable
。
这是我的代码:
MENUITEMINFO sInfo{};
sInfo.cbSize = sizeof(MENUITEMINFO);
sInfo.fMask = MIIM_STRING;
sInfo.dwTypeData = const_cast<TCHAR*>(strHostLabel.GetString());
SetMenuItemInfo(pMnuSwap->GetSafeHmenu(), SwapAssignment::Host, TRUE, &sInfo);
sInfo.dwTypeData = const_cast<TCHAR*>(strCoHostLabel.GetString());
SetMenuItemInfo(pMnuSwap->GetSafeHmenu(), SwapAssignment::Cohost, TRUE, &sInfo);
代码分析告诉我:
warning C26492: Don't use const_cast
to cast away const or volatile (type.3).
我知道他们说这样做是糟糕的设计,您可以调整 class 以允许它仍然是 const
但允许某些变量是可修改的。至少,我从链接的讨论中了解到这一点。
但这不适用于这种情况。
我看到了这个问题的答案 (How to convert LPCWSTR to LPWSTR),这意味着将字符串复制到另一个。有没有更简单的方法?
sInfo.dwTypeData
属于 LPWSTR
. 类型
GetString
returns一个LPCWSTR
.
这就是我使用 const_cast
的原因。有没有另一种方法可以使此代码分析兼容而不会使它过于复杂?
我的代码针对 32 位和 64 位编译。这就是为什么我一直使用 TCHAR
.
我认为最干净的方法是使用 GetBuffer。
在某些时候你会发现确实需要非常量字符串的函数:)
这里有一个关于不使用 const_cast
的有趣讨论,我们鼓励您使用 mutable
。
这是我的代码:
MENUITEMINFO sInfo{};
sInfo.cbSize = sizeof(MENUITEMINFO);
sInfo.fMask = MIIM_STRING;
sInfo.dwTypeData = const_cast<TCHAR*>(strHostLabel.GetString());
SetMenuItemInfo(pMnuSwap->GetSafeHmenu(), SwapAssignment::Host, TRUE, &sInfo);
sInfo.dwTypeData = const_cast<TCHAR*>(strCoHostLabel.GetString());
SetMenuItemInfo(pMnuSwap->GetSafeHmenu(), SwapAssignment::Cohost, TRUE, &sInfo);
代码分析告诉我:
warning C26492: Don't use
const_cast
to cast away const or volatile (type.3).
我知道他们说这样做是糟糕的设计,您可以调整 class 以允许它仍然是 const
但允许某些变量是可修改的。至少,我从链接的讨论中了解到这一点。
但这不适用于这种情况。
我看到了这个问题的答案 (How to convert LPCWSTR to LPWSTR),这意味着将字符串复制到另一个。有没有更简单的方法?
sInfo.dwTypeData
属于LPWSTR
. 类型
GetString
returns一个LPCWSTR
.
这就是我使用 const_cast
的原因。有没有另一种方法可以使此代码分析兼容而不会使它过于复杂?
我的代码针对 32 位和 64 位编译。这就是为什么我一直使用 TCHAR
.
我认为最干净的方法是使用 GetBuffer。
在某些时候你会发现确实需要非常量字符串的函数:)