继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
是静态的还是本地的,然后通过引用或值捕获,行为都是相同的。
答案 0 :(得分:3)
[]() { return hello; }
是[]() -> std::string { return hello; }
(没有参考)。
你的func
返回悬空指针(有const string&
)。
当您调用UB时,两个编译器都是正确的。
auto func = func_t{lambda};
是正确的。