lambda可以安全地返回复制变量的地址吗?

scr*_*nut 16 c++ lambda c++11

给出以下示例代码:

int main()
{
    int i;
    auto f = [=]()mutable->int*
    {
            return &i;
    };

    return 0;
}
Run Code Online (Sandbox Code Playgroud)
  1. g ++ v.4.8.1警告"返回的局部变量'i'的地址".
  2. Clang v.3.2(MacOS的Clang)警告说"与本地变量'i'相关联的堆栈存储器的地址返回".
  3. VS2012和VS2013 RC都没有发出任何警告.

我对lambdas的理解是编译器将生成一个仿函数类.该仿函数类将包含所有复制变量的成员(i在示例中).我相信在我的代码的上下文中,只要f存在,就可以安全地返回其成员之一的地址.在我看来,所有编译器都错了.我认为关于在超出范围之后使用该f成员的地址的警告是有效的,但关于"本地变量'我'的警告是不正确的/误导性的.我对吗?if

Pot*_*ter 7

你是对的.的&操作者施加到所述构件,而不是本地对象.

演示很简单:只需修改示例即可输出地址.

#include <iostream>

int main() {
    int i;
    std::cout << & i << '\n';

    std::cout << [=]() mutable -> int * {
        return & i;
    } () << '\n';
}
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/OqsDyg

顺便提一下,这-Wall在GCC 4.9中没有任何警告.