当前位置: 首页 > 知识库问答 >
问题:

返回lambda时的Clang警告-捕获lambda

栾英资
2023-03-14

下面尝试包装lambda的(简化的)代码给了我一些Clang版本的警告,但不是所有版本,也不是gcc版本。

template<typename Lambda>
auto wrapLambda(Lambda lambda)
{
    return [&lambda]() {
        lambda();
    };
}

auto wrappedLambda = wrapLambda([](){ return 0; });
warning: address of stack memory associated with parameter 'lambda' returned [-Wreturn-stack-address]  
    return [&lambda]() {  
             ^~~~~~

这是一个窃听器,还是我遗漏了什么?我在godbolt和clang 11.1.0版本中收到了x86-64 clang(trunk)的警告,这是一个更大的回购的一部分,但我还无法隔离该版本的故障。

这个相关问题中的例子没有给出警告。

改进(我认为)版本:

template<typename Callable>
auto wrapCallable(Callable&& callable)
{
    return [callable = std::forward<Callable>(callable)]() {
        callable();
    };
}

auto wrappedCallable = wrapCallable([](){ return 0; });

这将使Godbolt中的x86-64 clang(trunk)的警告沉默。我想它应该能安全地适用于任何一个functor,任何我遗漏的东西?

共有1个答案

锺离珂
2023-03-14

问题与此代码完全相同:

SomeType& foo(int x)
{
    SomeType bar{x};
    return bar; // undefined behavior returning reference to local object
}

lambda是通过引用捕获本地对象的,所以当您返回它时,这将导致未定义的行为,因为捕获的对象不再存在。

当你使用这个lambda时,程序很可能会崩溃(如果你不走运的话就不会崩溃)。

所以这是你代码中的bug,clang是正确的抱怨。

 类似资料:
  • 问题内容: 在我的python脚本中,我想使用MySql捕获“我的查询截断了列’xxx’的数据”警告。 我看到了一些建议以下代码的帖子,但它不起作用。 您是否知道在使用此代码之前是否必须导入某些特定模块或是否应调用某些选项/标志? 谢谢大家 阿菲格 问题答案: 警告仅仅是:警告。他们被报告给(通常)stderr,但是没有做其他事情。您不能像异常一样捕获它们,因为它们没有被引发。 你可以,但是,配置

  • 当用PDFBox加载PDF时,如果PDF错误,则会收到日志级警告: 例如,这可能导致控制台上的以下输出: 显然,pdf在内容流中有一些错误,但它确实加载到中。但是否有可能用PDFBOX以编程方式捕获此警告?是否存在一些属性来告诉您文档加载后的警告? 我试过PDFBox-Preflight,但这会检查PDF/A是否符合,这会导致更多的消息。

  • 我想要能够让我的catch请求用户输入文件名,直到文件名有效为止,有没有人能给我一个建议,如何安排我的代码做到这一点? 导入java.io.FileNotFoundException;导入java.util.scanner; public class Requierment2{public static void main(String[]args){ }

  • 本文向大家介绍python捕获警告的三种方法,包括了python捕获警告的三种方法的使用技巧和注意事项,需要的朋友参考一下 1. 警告不是异常 你是不是经常在使用一些系统库或者第三方模块的时候,会出现一些既不是异常也不是错误的警告信息? 这些警告信息,有时候非常多,对于新手容易造成一些误判,以为是程序出错了。 实则不然,异常和错误,都是程序出现了一些问题,但是警告不同,他的紧急程度非常之低,以致于

  • 我最近开始尝试llvm的< code>clang-tidy工具。现在我正试图抑制来自第三方库代码的错误警告。为此,我想使用命令行选项

  • 下面的SCCE显示了实现接口标记的两个类(B和C)。对于实现Marker的每个类,都有一个实现泛型处理程序接口的对应类(B_处理程序、C_处理程序)。映射用于关联Pair的类类型。其次是它的关联处理程序。代码按预期执行;但是,我得到一个编译时警告: 警告:[未检查]未检查的强制转换处理程序h1=(处理程序)(dispatch.get(p1.second.get类()));需要:处理程序找到:处理程