c++ - 抑制 lint 消息 lnt-accidental-copy 'auto' 不会推断出引用
问题描述
在 Visual Studio 2019 16.11.4 中,以下代码为我提供了 for() 语句的 lint 消息:
lnt-accidental-copy 'auto' doesn't deduce references. A possibly unintended copy is being made.
(这是一个虚构的例子,从真实代码简化而来。我实际上不仅仅是打印一个奇数列表。)
#include <vector>
#include <algorithm>
#include <iostream>
#include <iterator>
using namespace std;
class SomeClass
{
public:
int i;
};
void SomeMethod(vector<SomeClass> vectorOfStuff)
{
auto partIt = partition(begin(vectorOfStuff), end(vectorOfStuff), [](auto& x) {
return (x.i & 1) == 0;
});
for (auto it = partIt; it != end(vectorOfStuff); ++it)
{
cout << "doing something with " << it->i << endl;
}
vectorOfStuff.erase(partIt, end(vectorOfStuff));
}
建议的解决方法是auto it = partIt
将auto &it = partIt
. 通常这是个好建议,但在这种情况下,我想保持 partIt 不变,以便调用 erase() 所以我想要一个副本,而不是参考。
根据linter 的公告:
配置:当前该功能已启用或禁用。当前版本中无法启用/禁用或更改单个检查的严重性。
而且我还没有发现任何关于压制的最新消息。
我想出的一种解决方法是auto it = partIt
将auto it = next(partIt, 0)
. 另一种是将其拼写为vector<SomeClass>::iterator it = partIt
. 但是这两个看起来有点笨重,我必须添加评论来解释我正在处理一条 lint 消息。
有没有更简洁的方式说“是的,我真的想要一个迭代器的副本”?还是我错过了在这种情况下如何抑制消息?
解决方案
推荐阅读
- spring - 用 Mockito 比较两个 getter 之间的相等或不相等
- php - 旧与新?或者工厂方法定义()和$factory->define()有什么区别
- angular - 对使用 ngFor 显示的数组进行排序会应用 void 动画状态
- mysql - MySQL 导出表到 CSV utf-8 编码问题
- php - 未找到 pdo 驱动程序
- android - 支持导航组件的隐式和显式深度链接
- excel - 运行此代码时 Excel 崩溃?(将数据从 Excel 传输到 Word)
- python - 如果在 PYTHON pandas 中针对特定细胞起作用
- salesforce - 使用 Hi Velocity Sales 跟踪电子邮件打开并单击
- python - 无论层次结构如何,使用 Python 提取 JSON 中具有相同字段的内容