PVS Studio 6.17(Windows 7、64Bit、VS2015)似乎对下面的代码给出了错误警告。警告“已创建 'unordered_map' 类型的 V808 'statuses' 对象但未使用”。使用几个 QStringLiteral 键值初始化 unordered_map 的原始代码。仅使用 STL 的简化版本如下所示:
#include <string>
#include <unordered_map>
#include <iostream>
// Simplified analogue of QStringLiteral
#define StringLiteral(str) ([]() { return std::string{str}; }())
int main()
{
const std::unordered_map<std::string, int> statuses{
{ StringLiteral("aaa"), 1 },
{ StringLiteral("bbb"), 2 },
{ StringLiteral("ccc"), 3 }
};
auto iter = statuses.find("aaa");
if (iter != statuses.cend())
std::cout << iter->first << " has status: " << iter->second << std::endl;
return 0;
}
奇怪的是,V808 是在使用 lambda 中的返回值的通用初始化时产生的。如果使用构造函数语法,则不会显示警告。
另一个产生 V808 的错误案例在这里:
const std::unordered_map<int, std::function<void(int, int)>> functions{
{ 0, [](int a, int b) {} },
{ 1, [](int a, int b) {} },
};
const auto it = functions.find(0);
if (it != functions.cend() && it->second)
it->second(1, 2);
在这里,如果使用一个参数 lambdas 创建映射 - 没有 V808,它会呈现 2 个或更多参数。
参考:
这个问题已知吗?