首页 > 解决方案 > 为什么 ++ 运算符触发器返回对局部变量警告的引用

问题描述

和之间的主要区别很明显[link]++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;
}

标签: c++

解决方案


好的,已经深入了解了库的源代码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是局部变量,因此通过引用返回它会生成您看到的警告。


推荐阅读