下面的代码会在 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 都没有问题。
演示
让我尝试用我有限的知识来回答这个问题。
首先根据cppreference:
返回的视图由两个迭代器构造,一个指向不小于 value 的第一个元素,另一个指向大于 value 的第一个元素。
到目前为止一切顺利,只需确保范围已正确排序即可。
至于使用结构化绑定带来的任何复杂性,这篇文章帮助我解决了这个问题:
https://jguegant.github.io/blogs/tech/structured-bindings.html
所以,tl;博士;我认为没关系,Intellisense 只是在喊狼来了。