给出以下示例代码:
int main()
{
int i;
auto f = [=]()mutable->int*
{
return &i;
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我对lambdas的理解是编译器将生成一个仿函数类.该仿函数类将包含所有复制变量的成员(i
在示例中).我相信在我的代码的上下文中,只要f
存在,就可以安全地返回其成员之一的地址.在我看来,所有编译器都错了.我认为关于在超出范围之后使用该f
成员的地址的警告是有效的,但关于"本地变量'我'的警告是不正确的/误导性的.我对吗?i
f
你是对的.的&
操作者施加到所述构件,而不是本地对象.
演示很简单:只需修改示例即可输出地址.
#include <iostream>
int main() {
int i;
std::cout << & i << '\n';
std::cout << [=]() mutable -> int * {
return & i;
} () << '\n';
}
Run Code Online (Sandbox Code Playgroud)
顺便提一下,这-Wall
在GCC 4.9中没有任何警告.
归档时间: |
|
查看次数: |
440 次 |
最近记录: |