在std :: function-wrapped lambda中返回对静态变量的引用会导致segfault

时间:2018-03-16 09:02:05

标签: c++ lambda static

this question之后,我意识到std::function存在更多基本问题 - 特别是我在lambda 中返回对静态变量的引用时遇到了段错误,但只是当lambda包裹在std::function

中时
#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++,clang ++似乎两者都没问题。哪个编译器正确?如果是g ++,为什么使用std::function不起作用。

我应该注意,无论hello是静态的还是本地的,然后通过引用或值捕获,行为都是相同的。

1 个答案:

答案 0 :(得分:3)

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

你的func返回悬空指针(有const string&)。

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

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