为什么 ++ 运算符触发器返回对局部变量警告的引用

Why ++ operator triggers returns a reference to a local variable warning

本文关键字:局部变量 警告 引用 返回 运算符 触发器 为什么      更新时间:2023-10-16

++varvar++之间的主要区别很明显[链接]。

我的问题是关于它们对参考文献的影响。以下是详细信息:我引用了一个cuDF::multimap如下所示:

found = map->find(key)

当我尝试递增该引用时,使用++found可以正常工作。但是,使用found++会返回以下警告:

警告:返回对局部变量的引用

我理解警告的含义。有人可以解释为什么我会收到此警告吗?

更多详情

也就是说,以下代码片段将生成上述警告。

found = map->find(key);
while (found != map->end() && found->first != unusedKey) {
std::cout << found->second << std::endl;
found++;
}

但是,这不会产生任何警告:

found = map->find(key);
while (found != map->end() && found->first != unusedKey) {
std::cout << found->second << std::endl;
++found;
}

好的,已经深入研究了库cuDF的源代码。

map->find(key)返回一个迭代器,它是模板类cycle_iterator_adapter的一些实例化。

它的后缀增量运算符定义如下:

__host__ __device__ cycle_iterator_adapter& operator++(int)
{
cycle_iterator_adapter<iterator_type> old( m_begin, m_end, m_current);
if ( m_end == (m_current+1) )
m_current = m_begin;
else
++m_current;
return old;
}

这里的返回类型是cycle_iterator_adapter&,这是一个引用。由于old是一个局部变量,因此通过引用返回它会生成您看到的警告。