这个对 ostream 的引用是局部变量吗

Is this reference to ostream a local variable

在 c++primer 第 5 版 p393 中这样写:

The variables captured by a lambda are local variables

本书随后将 ostream 显示为引用参数,由 lambda 通过引用捕获。 这是相似的:

#include <iostream>
using namespace std;
void foo(ostream &os) {
    auto f = [&os]() { os << "Hellow World !" << endl; //return os;
    };
    f();
}
void main() {
    foo(cout);
    system("pause");
}

我纠结的是这里 os 不是 foo 的局部变量,它存在于 foo 的范围之外,但它可以被 lambda 捕获而 "The variables captured by a lambda are local variables"。我在这里错过了什么? 另外,为什么 lambda 不能 return os; ?毕竟,os 不是一个存在于 lambda 和 foo 范围之外的对象吗?

What i struggle with is that here os is not a local variable to foo, it exists outside of foo's scope,

不,它是本地的,存在于foo之外。

os引用的对象存在于foo之外,因为os是一个引用。但这在这里无关紧要,因为我们谈论的是变量,而不是对象

Also, why can the lambda not return os;?

可以,你只需要指定一个明确的return类型,否则return类型被推断为std::ostream,即代码将尝试复制 流,它是不可复制的。

但以下有效:

auto f = [&os]() -> std::ostream& { return os << "Hellow World !" << endl; };

上面的 lambda 被编译器编译成类似于 foo2() 中的 f2 的东西。因此 lambda 实例在 foo2 中是本地的,并且 ostream 引用(指针)是本地 lambda 实例中的成员变量。

所以你必须确保,带有对 ostream 的包装引用的 lambda 不会超过 ostream (os) 本身,这不会发生在这个情况下,因为 lambda 实例仅存在于函数范围内 -> 小于传递的 ostream 引用 os 参数的范围。

#include <iostream>
using namespace std;
void foo(ostream &os) {
    auto f = [&os]() { os << "Hellow World !" << endl; //return os;
    };
    f();
}

void foo2(ostream& os) {
    // The lambda f from foo is compiled to something similar to f2.
    struct f2 {
        f2(ostream& oss)
        : os_(oss) {}

        void operator()() const
        {
            os_ << "Hellow World !" << endl; 
        }

        private:
        ostream& os_; // Note: this is reference, but local to f2 ( == "lambda")
    };

    f2 t(os);
    t(); // call "lambda"
}

int main() {
    foo(cout);
    foo2(cout);
    return 0;
}