代码之家  ›  专栏  ›  技术社区  ›  cmannett85

返回对std::函数包装lambda中静态变量的引用导致segfault

  •  2
  • cmannett85  · 技术社区  · 6 年前

    从以下位置开始 this question ,我意识到 std::function -具体来说,我在返回对lambda中静态变量的引用时遇到了segfaults 但仅限于 当lambda被包裹在 std::函数 :

    #include <iostream>
    #include <functional>
    
    using namespace std::string_literals;
    
    namespace
    {
    const auto hello = "Hello"s;
    }
    
    int main()
    {
        using func_t = std::function<const std::string& ()>;
    
        auto lambda = []() -> const std::string& { return hello; };
        std::cout << lambda() << std::endl; // Fine
    
        auto func = func_t{[]() { return hello; }};
        std::cout << func() << std::endl;   // Bang!
    
        return EXIT_SUCCESS;
    }
    

    这个 segfault only occurs on g++ ,铿锵++似乎对两者都很好。哪个编译器是正确的?如果是g++,为什么使用 std::函数 不工作。

    我应该注意到,无论是否 hello 是静态的或本地的,然后通过引用或值捕获。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Jarod42    6 年前

    []() { return hello; } []() -> std::string { return hello; } (无参考)。

    你的 func 返回临时的悬挂指针(要有 const string& )。

    调用UB时,这两个编译器都是正确的。

    auto func = func_t{lambda}; 是正确的。