这是 C26800 使用移动对象警告的误报案例吗?

问题描述 投票:0回答:1

下面的代码会在 Visual Studio 2022(带有 /std:c++latest 的最新版本)中导致以下 IntelliSense 警告:

警告 C26800 使用移出的对象:“$S2”(lifetime.1)

用于带有

std::ranges::equal_range
的线。

这是误报还是代码中存在一些真正的问题?

仅当分配给

auto [it_lower, it_upper]
时才会出现此问题;如果它被分配给
range
,则不会出现警告。无论应用于基于视图创建的范围(如示例中)还是任何其他容器,都没关系,我使用此语法只是为了简洁起见。

代码

#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>

int main()
{
    auto range = std::ranges::iota_view{ 1, 100 };

    auto [it_lower, it_upper] = std::ranges::equal_range(range, 10, {}, {});

    while (it_lower != it_upper) {
        ++it_lower;
    }
}

编译、运行、检查没有任何问题。在 godbolt 上使用 clang 和 msvc 都没有问题。

演示

c++ visual-studio stl visual-studio-2022 std-ranges
1个回答
0
投票

让我尝试用我有限的知识来回答这个问题。

首先根据cppreference

返回的视图由两个迭代器构造,一个指向不小于 value 的第一个元素,另一个指向大于 value 的第一个元素。

到目前为止一切顺利,只需确保范围已正确排序即可。

至于使用结构化绑定带来的任何复杂性,这篇文章帮助我解决了这个问题:

https://jguegant.github.io/blogs/tech/structured-bindings.html

所以,tl;博士;我认为没关系,Intellisense 只是在喊狼来了。

© www.soinside.com 2019 - 2024. All rights reserved.