首页 > 解决方案 > 抑制 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 = partItauto &it = partIt. 通常这是个好建议,但在这种情况下,我想保持 partIt 不变,以便调用 erase() 所以我想要一个副本,而不是参考。

根据linter 的公告

配置:当前该功能已启用或禁用。当前版本中无法启用/禁用或更改单个检查的严重性。

而且我还没有发现任何关于压制的最新消息。

我想出的一种解决方法是auto it = partItauto it = next(partIt, 0). 另一种是将其拼写为vector<SomeClass>::iterator it = partIt. 但是这两个看起来有点笨重,我必须添加评论来解释我正在处理一条 lint 消息。

有没有更简洁的方式说“是的,我真的想要一个迭代器的副本”?还是我错过了在这种情况下如何抑制消息?

标签: c++visual-studio

解决方案


推荐阅读