#include <iostream>
#include <string>
#include <vector>
using namespace std;
template<typename Init,typename T> Init find(Init begin,Init end,const T& val){
while(begin!=end){
if(val==(*begin)){
return begin;
}
++begin;
}
return end;
}
//为什么前2个参数改成引用就不行了
template<typename Init,typename T> Init find_(Init &begin,Init &end,const T& val){
while(begin!=end){
if(val==(*begin)){
return begin;
}
++begin;
}
return end;
}
int main(){
int arr[5] = {1,2,3,45,5};
string sarr[5] = {"b","c ","dd","ee","ff"};
vector<int> ivec(arr,arr+5);
vector<string> svec(sarr,sarr+5);
vector<int>::iterator it;
vector<string>::iterator sit;
if((it=find(ivec.begin(),ivec.end(),3))!=ivec.end()){
cout << *it << "is in the vector" << endl;
}else{
cout << "not found!" << endl;
}
if((sit = fd_(svec.begin(),svec.end(),string("b")))!=svec.end()){
cout << "find" << endl;
}
else{
cout << "not find";
}
}
把find函数的前两个形参改成引用,会产生编译错误,为什么
error: invalid initialization of non-const reference of type ‘__gnu_cxx::__normal_iterator, std::vector >&’ from an rvalue of type ‘std::vector::iterator {aka __gnu_cxx::__normal_iterator, std::vector >}’
if((it=find_(ivec.begin(),ivec.end(),3))!=ivec.end()){
^
error: in passing argument 1 of ‘Init find_(Init&, Init&, const T&) [with Init = __gnu_cxx::__normal_iterator >; T = int]’
template Init find_(Init &begin,Init &end,const T& val){
vector::iterator begin = svec.begin();
vector::iterator end = svec.end();
if((sit = find_(begin,end,string("b")))!=svec.end()){
cout << "find" << endl;
}
else{
cout << "not find";
}
1、看代码
2、编译结果
3、分析和解决
就拿f(a + b)来说,a+b的值会存在一个临时变量中,当把这个临时变量传给f时,由于f的声明中,参数是int&,不是常量引用,因为c++编译器的一个关于语义的限制。如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制。
修改:
或则函数参数引用加上const
4、总结
c++中临时变量不能作为非const的引用参数
vector::iterator begin = svec.begin();
vector::iterator end = svec.end();
if((sit = find_(begin,end,string("b")))!=svec.end()){
cout << "find" << endl;
}
else{
cout << "not find";
}
1、看代码
2、编译结果
3、分析和解决
就拿f(a + b)来说,a+b的值会存在一个临时变量中,当把这个临时变量传给f时,由于f的声明中,参数是int&,不是常量引用,因为c++编译器的一个关于语义的限制。如果一个参数是以非const引用传入,c++编译器就有理由认为程序员会在函数中修改这个值,并且这个被修改的引用在函数返回后要发挥作用。但如果你把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以,一般说来,修改一个临时变量是毫无意义的,据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制。
修改:
或则函数参数引用加上const
4、总结
c++中临时变量不能作为非const的引用参数
正确代码如下:
if((it=find(ivec.begin(),ivec.end(),3))!=ivec.end()){
cout << it << "is in the vector" << endl;
}else{
cout << "not found!" << endl;
}
**if((sit = fd_(svec.begin(),svec.end(),string("b")))!=svec.end()){
cout << "find" << endl;
}*
else{
cout << "not find";
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。