给出以下示例代码:
int main()
{
int i;
auto f = [=]()mutable->int*
{
return &i;
};
return 0;
}
- g++ v.4.8.1 警告“返回局部变量‘i’的地址”。
- Clang v.3.2(MacOS 的 Clang)警告说“堆栈内存的地址 与返回的局部变量“i”相关联”。
- VS2012 和 VS2013 RC 均未发出任何警告。
我对 lambdas 的理解是编译器会生成一个仿函数类。该仿函数类将具有所有复制变量的成员(示例中为 i
)。我相信在我的代码上下文中,只要 f
存在,返回其成员之一的地址是安全的。在我看来,所有编译器都弄错了。我认为在 f
超出范围后使用 f
的成员 i
的地址的警告是有效的,但有关“局部变量 'i'"不正确/具有误导性。我说的对吗?
最佳答案
是的,你是对的。 &
运算符应用于成员,而不是本地对象。
演示很简单:只需修改您的示例以输出地址。
#include <iostream>
int main() {
int i;
std::cout << & i << '\n';
std::cout << [=]() mutable -> int * {
return & i;
} () << '\n';
}
顺便说一句,在 GCC 4.9 中的 -Wall
下编译时没有警告。
关于c++ - lambda 可以安全地返回复制变量的地址吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18949577/