这个对 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;
}
在 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 tofoo
, it exists outside offoo
'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;
}