突击嘉年华,薛位山,第一高考网
#include <iostream> #include <vector> //注意begin和end形参都声明为引用 bool find_int(std::vector<int>::iterator &begin, std::vector<int>::iterator &end, int v){ while(begin != end){ if(*begin == v) return true; begin++; } return false; } int main(){ std::vector<int> a(3, 100); //a.begin()和a.end()的返回值作为实参传入find_int中 std::cout << find_int(a.begin(), a.end(), 100) << std::endl; }
g++ -wall -std=c++11 -o hello hello.cpp
non-const lvalue reference cannot bind to a temporary
根据编译错误提示可以知道,不能将形参begin、end绑定到a.begin()和a.end()的返回值,因为该返回值是一个临时量,临时量的生命周期可能在a.begin()和a.end()执行完后就结束了。因此编译器认为普通引用绑定一个临时量,在find_int函数中可能会修改这个临时量,然而此时临时量可能已经被销毁,从而导致一些未定义的行为,因此编译器不允许将普通引用绑定到一个临时量上。
将普通引用改为常量引用(ps:改为常量引用后不能修改绑定的对象,只能读不能写)
bool find_int(const std::vector<int>::iterator &begin, const std::vector<int>::iterator &end, int v)
修改函数的形参声明,将引用改成普通变量
bool find_int(std::vector<int>::iterator begin, std::vector<int>::iterator end, int v)
用变量存储a.begin()和a.end()的返回值
std::vector<int>::iterator begin = a.begin(); std::vector<int>::iterator end = a.end(); std::cout << find_int(begin, end, 100) << std::endl;
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
如何在没有core文件的情况下用dmesg+addr2line定位段错误
用QT制作3D点云显示器——QtDataVisualization
网友评论