c – 从类型的右值开始无效初始化’std :: vector&’类型的
发布时间:2020-12-16 10:24:48 所属栏目:百科 来源:网络整理
导读:我正在学习c并尝试一些事情.编译器没有在注释2行引发错误. int main(){ vectordouble a1; a1.push_back(3); a1.push_back(7); a1.push_back(2); vectordouble a2 = a1; //COMMENT 1: This line has no error vectordouble a4 = print(a2); //COMMENT 2: Why
我正在学习c并尝试一些事情.编译器没有在注释2行引发错误.
int main(){ vector<double> a1; a1.push_back(3); a1.push_back(7); a1.push_back(2); vector<double>& a2 = a1; //COMMENT 1: This line has no error vector<double>& a4 = print(a2); //COMMENT 2: Why this line has error? R value is an object then it should be referenced by a4? return 0; } vector<double> print(vector<double>& a3){ cout<<"In print function the size of vector is :"; cout<<a3.size()<<endl; return a3; } 解决方法
Blehh,所以……是的,返回值是暂时的.因此,持有对它的引用是没有意义的(想象一下:当临时被破坏时引用什么都没有引用).因此,它是不允许的.
您可以通过多种方式解决此问题: I.持有const引用,如 const vector<double> &retVal = print(); const引用将绑定临时的生存期延长到引用的生命周期. II.只需按值返回: vector<double> retVal = print(); III.返回对您知道将具有足够生命周期的对象的引用,例如: G.班级成员: class Foo { vector<double> vec; public: vector<double> &print() { return vec; } }; Foo f; vector<double> &retVal = f.print(); 但是,请不要从函数中返回对临时的引用,如下所示: // this is wrong: vector<double> &print() { vector<double> v; return v; } 因为它调用未定义的行为. (请注意,这与您的示例不同,因为您返回的函数的参数当然是活的,但值得注意这种情况,因为这是一个常见的错误.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |