【问题标题】:Assigning local variable to by-reference parameter将局部变量分配给引用参数
【发布时间】:2012-08-01 11:08:51
【问题描述】:

来自 C,Accelerated 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 能够脱离本地范围呢?

【问题讨论】:

    标签: c++ reference scope


    【解决方案1】:

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

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

    vector<Student_info>* students
    

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

    students = &pass;
    

    事实上它等价于这个

    *students = pass;
    

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

    【讨论】:

      【解决方案2】:

      pass 对象不会脱离本地范围。

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

      【讨论】:

        【解决方案3】:

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

        students = pass;
        

        就是这么做的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多