将局部变量分配给by-reference参数

时间:2012-08-03 11:44:25

标签: c++ reference scope

来自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能够将其排除在本地范围之外?

3 个答案:

答案 0 :(得分:9)

您可能认为引用students正在被“重新引用”到局部变量pass。不是这种情况。而是通过operator=传入的现有对象调用students,并将pass中的数据复制到其中。

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

vector<Student_info>* students

您的问题意味着您认为您引用的代码等同于以下

students = &pass;

实际上它等同于

*students = pass;

事实上,这两个操作中的第一个不能在引用上执行 - 引用不能“重新引用”。

答案 1 :(得分:3)

pass对象不会转义本地范围。

students = pass行复制了传递值 - 对于一个向量,这是元素 - 进入学生。

答案 2 :(得分:3)

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

students = pass;

就是这样。