通过引用参数将局部变量赋值给 P.从C++中,加速C++第5章中的这个例子引起了我的注意: vector<Student_info> extract_fails(vector<Student_info>& students) { vector<Student_info> pass, fail; for (vector<Student_info>::size_type i = 0; i != students.size(); ++i) if (fgrade(students[i])) fail.push_back(students[i]); else pass.push_back(students[i]); students = pass; return fail; } 向量提取_失败(向量和学生){ 向量通过,失败; 对于(vector::size_type i=0;i!=students.size();++i) if(fgrade(学生[i])) 失败。推回(学生[i]); 其他的 通过。推回(学生[i]); 学生=通过; 返回失败; }

通过引用参数将局部变量赋值给 P.从C++中,加速C++第5章中的这个例子引起了我的注意: vector<Student_info> extract_fails(vector<Student_info>& students) { vector<Student_info> pass, fail; for (vector<Student_info>::size_type i = 0; i != students.size(); ++i) if (fgrade(students[i])) fail.push_back(students[i]); else pass.push_back(students[i]); students = pass; return fail; } 向量提取_失败(向量和学生){ 向量通过,失败; 对于(vector::size_type i=0;i!=students.size();++i) if(fgrade(学生[i])) 失败。推回(学生[i]); 其他的 通过。推回(学生[i]); 学生=通过; 返回失败; },c++,reference,scope,C++,Reference,Scope,由于返回了fail,我知道它是局部变量不是问题。但是为什么pass能够使其脱离本地范围?该pass对象不能脱离本地范围 行students=pass将pass的值(对于向量,这是元素)复制到students中。students通过引用传递,从而允许修改作为参数传递的原始值。声明 students = pass; 就是这样。您可能认为引用学生正被“重新引用”到局部变量pass。事实并非如此。相反,operator=在通过students传入的现有对象上被调用,来自pass的数据被复制到该对象中

由于返回了
fail
,我知道它是局部变量不是问题。但是为什么
pass
能够使其脱离本地范围?

pass
对象不能脱离本地范围


students=pass
将pass的值(对于向量,这是元素)复制到students中。

students
通过引用传递,从而允许修改作为参数传递的原始值。声明

students = pass;

就是这样。

您可能认为引用
学生
正被“重新引用”到局部变量
pass
。事实并非如此。相反,
operator=
在通过
students
传入的现有对象上被调用,来自
pass
的数据被复制到该对象中

由于您来自C,您可能更熟悉指针而不是引用。让我们假设
学生
被声明为指针,即

vector<Student_info>* students
事实上,它与此相当

*students = pass;
实际上,这两个操作中的第一个不能在引用上执行——引用不能“重新引用”

*students = pass;