通过引用参数将局部变量分配给

Assigning local variable to by-reference parameter

本文关键字:局部变量 分配 参数 引用      更新时间:2023-10-16

来自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;
}

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

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

由于你来自C,你可能更熟悉指针而不是引用。假设students被声明为指针,即

vector<Student_info>* students

你的问题意味着你相信你引用的代码相当于下面的

students = &pass;

而实际上它相当于这个

*students = pass;

事实上,这两个操作中的第一个不能在引用上执行——引用不能被"重新引用"。

pass对象不会脱离本地作用域。

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

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

students = pass;

就是这样。