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

MTM*_*TMD -1 c++

和之间的主要区别是显而易见的[link]++varvar++

我的问题是关于参考文献的影响。这是详细信息:我参考cuDF::multimap了以下内容:

found = map->find(key)
Run Code Online (Sandbox Code Playgroud)

当我尝试增加该引用时,使用++found效果很好。但是,使用found++将返回以下警告:

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

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

更多细节

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

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

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

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

Kae*_*Rin 6

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

map->find(key)返回一个迭代器,该迭代器是template类的实例化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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 不幸的是,图书馆使用非惯用语代码来实现其基本代码。 (2认同)
  • @RSahu是的。我相信这是库中的错误。操作员应该返回`cycle_iterator_adapter`。 (2认同)