C++ 为什么++;运算符触发器返回对局部变量警告的引用
C++ 为什么++;运算符触发器返回对局部变量警告的引用,c++,C++,++var和var++之间的主要区别是显而易见的 我的问题是它们对参考文献的影响。以下是详细信息:我有一个对cuDF::multimap的引用,如下所示: found = map->find(key) 当我尝试增加该引用时,使用++found可以很好地工作。但是,使用found++返回以下警告: 警告:返回对局部变量的引用 我理解这个警告的含义。有人能解释为什么我会收到这个警告吗 更多详细信息 也就是说,下面的代码片段将生成上述警告 found = map->find(key);
++var
和var++
之间的主要区别是显而易见的
我的问题是它们对参考文献的影响。以下是详细信息:我有一个对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(键);
while(found!=map->end()&&found->first!=unusedKey){
std::cout secondOk,已经深入到库的源代码cuDF
map->find(key)
返回一个迭代器,它是模板类cycle\u iterator\u adapter
的一些实例化
其后缀增量运算符定义如下:
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
{
循环迭代器适配器旧(m_开始、m_结束、m_当前);
如果(m_端==(m_电流+1))
m_电流=m_开始;
其他的
++m_电流;
返老还童;
}
这里的返回类型是cycle\u iterator\u adapter&
,这是一个引用。由于old
是一个局部变量,通过引用返回它会生成您看到的警告。我相信编译器会收到警告,因为您正在返回对函数局部变量的引用。++found
可能会返回引用ce after inc.found++
必须返回inc之前的值。因此,您可能得到了一个副本-一个临时副本。返回对它的引用使编译器抱怨合理。顺便说一句,从您公开的代码中,found++
的相关细节不清楚。a会很好。“当我尝试增加该引用时”不要说,show。什么是cuDF::multimap?@all,有人知道我为什么在这里得到了两个-1吗?当库使用非惯用代码来实现其代码的基本部分时,这是很不幸的。@RSahu是的。我相信这是库中的一个bug。操作符应该返回cycle\u iterator\u adapter
。
found = map->find(key);
while (found != map->end() && found->first != unusedKey) {
std::cout << found->second << std::endl;
++found;
}