在学校的面向对象编程课上,我们学习了C++中的Lambda表达式,教授明确表示捕获Lambda表达式内变量的到达范围只是最内层的封装范围。
考虑到讲座,我的结论是下面的代码不应该起作用,因为变量b和c是在 lambda 自身范围的最内部封装范围之外定义的。不幸的是,它确实有效。
我曾尝试使用g++和clang编译代码,并且两者都产生了正确的结果?结果。
我的问题是这是否是未定义的行为,或者编译器正在尝试用它做一些事情,或者我们可能被错误地教导?
int main(int argc, char const *argv[])
{
int a = 5;
{
int b = 10;
{
int c = 15;
{
int a = 10;
auto f = [&]()
{
std::cout << a << b << c;
};
f();
std::cout << a;
}
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
另外,在和助理教授一起练习Lambda表达式时,他告诉我们尝试编译以下.cpp文件。
int main(int argc, char *argv[])
{
int …Run Code Online (Sandbox Code Playgroud)