我正在尝试解决以下警告。
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);
我还尝试了许多其他选项。 它们都会导致完全相同的警告。我需要使用什么魔法咒语才能避免出现警告?
最佳答案
这似乎是静态分析工具中的错误。我怎么知道?因为如果您这样做,您不会收到此警告:
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++ 原因可以解释为什么从结构体中获取数组会引起衰减,而使用自动变量则不会。
很明显,这是分析工具中的一个错误,是误报。
关于c++ - 如何使用 gsl::span 修复 No array to Pointer Decay 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48819631/