我尝试使用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?
答案 0 :(得分:4)
这确实是Clang中的一个错误 - 您正在通过引用正确捕获这两个变量,并且不会创建任何悬空引用。我假设每次有人在任何内容中返回对堆栈变量的引用时,Clang会自动发出警告,无论是lambda还是函数。
Clang 3.5 does not show this warning anymore,neither does GCC 4.9.0。