c++ - 警告从 lambda 返回捕获的引用

标签 c++ c++11 lambda

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

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

这会在 clang 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 错误?

最佳答案

这确实是 Clang 中的一个错误 - 您通过引用正确地捕获了两个变量并且没有创建悬挂引用。我假设每当有人返回对任何东西(无论是 lambda 还是函数)中的堆栈变量的引用时,Clang 都会自动发出警告。

clang 3.5 does not show this warning anymore , neither does GCC 4.9.0 .

关于c++ - 警告从 lambda 返回捕获的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26744556/

相关文章:

c++ - 减少 Wasm 文件大小(libc、优化、emscripten)

c++ - 如何改进 Lua 内部错误消息以包含行号?

c++ - use-defined 转换为数组引用

c++ - 哪些库对 std::make_shared 使用了 "We Know Where You Live"优化?

c# - c#中的lambda表达式和var关键字

java - 如何用 future 修复 java lambda 过滤器(缺少返回语句)

c# - 在 C# 和 C++ 之间共享变量

c++ - 用鼠标移动 QGraphicsRectItem

c++ - 模板化类型定义?

lambda - 您可以使用 Lambda 在通过 Cloudformation 创建的 RDS 上创建架构吗?