我正在尝试解决以下警告。
warning C26485: Expression 'pNMLink->item.szUrl':
No array to pointer decay. (bounds.3...)
此警告是由以下代码引起的。
auto pNMLink = reinterpret_cast<PNMLINK>(pNMHDR);
ShellExecuteW(nullptr, L"open", pNMLink->item.szUrl, nullptr, nullptr, SW_SHOWNORMAL);
C++ Core Guidelines的极其有限的文档表明解决方案是使用跨度。
array decay -- use span (from the GSL)
不幸的是,它没有提供有关如何从数组构建该范围的信息。
我尝试了以下内容。
gsl::span<wchar_t> url(pNMLink->item.szUrl);
我也尝试过其他一些选择。 它们都会产生相同的警告。我需要使用什么神奇的咒语来避免警告?
答案 0 :(得分:2)
这似乎是静态分析工具中的错误。我怎么知道?因为如果你这样做,你就不会收到这个警告:
int arr[10];
gsl::span<int> sp1(arr);
但如果你这样做,你会收到警告:
struct Arr { int arr[10]; };
Arr test;
gsl::span<int> sp2(test.arr);
gsl::span
有一个构造函数,它通过引用获取数组参数,所以当你直接传递一个数组时,应该没有衰减。如sp1
所示,它没有发出警告。并且没有C ++原因,为什么从结构中获取数组会在使用自动变量时引起衰减。
很明显,这是分析工具中的一个错误,是误报。