从以下位置开始 this question ,我意识到 std::function -具体来说,我在返回对lambda中静态变量的引用时遇到了segfaults 但仅限于 当lambda被包裹在 std::函数 :
std::function
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 是静态的或本地的,然后通过引用或值捕获。
hello
[]() { return hello; } 是 []() -> std::string { return hello; } (无参考)。
[]() { return hello; }
[]() -> std::string { return hello; }
你的 func 返回临时的悬挂指针(要有 const string& )。
func
const string&
调用UB时,这两个编译器都是正确的。
auto func = func_t{lambda}; 是正确的。
auto func = func_t{lambda};