警告从lambda返回捕获的引用

时间:2014-11-04 20:36:53

标签: c++ c++11 lambda

我尝试使用lambda来有条件地将引用绑定到两个变量之一:

int foo, bar;
int &choice = [&]() -> int & {
    if (true /* some condition */) {
        return foo;
    } else {
        return bar;
    }
}();

这会在第3.4条中产生警告:

stack_stuffing.cpp:5:20: warning: reference to stack memory associated with
      local variable 'foo' returned [-Wreturn-stack-address]
            return foo;
                   ^~~
stack_stuffing.cpp:7:20: warning: reference to stack memory associated with
      local variable 'bar' returned [-Wreturn-stack-address]
            return bar;
                   ^~~

但是我只返回对调用lambda的范围内的堆栈内存的引用。这种行为是指定的,未指定的还是clang bug?

1 个答案:

答案 0 :(得分:4)

这确实是Clang中的一个错误 - 您正在通过引用正确捕获这两个变量,并且不会创建任何悬空引用。我假设每次有人在任何内容中返回对堆栈变量的引用时,Clang会自动发出警告,无论是lambda还是函数。

Clang 3.5 does not show this warning anymoreneither does GCC 4.9.0