C++ 为什么这个std::函数和运算符会导致分段错误?

C++ 为什么这个std::函数和运算符会导致分段错误?,c++,C++,我看不出这个代码有什么问题,但它给了我一个seg错误。将std::函数更改为普通函数可以解决此问题。另外,删除重载操作符中的加法也解决了这个问题。将点构造函数从const int&更改为int也可以解决这个问题。但我不明白为什么。 #包括 #包括 结构点 { int x,y; 点(){} 点(常数int&x,常数int&y){} }; 点运算符+(常量点&p1,常量点&p2){return{p1.x+p2.x,p1.y+p2.y};} 点p1,p2; 函数fn=[]返回p1;}; int ma

我看不出这个代码有什么问题,但它给了我一个seg错误。将std::函数更改为普通函数可以解决此问题。另外,删除重载操作符中的加法也解决了这个问题。将点构造函数从const int&更改为int也可以解决这个问题。但我不明白为什么。

#包括
#包括
结构点
{
int x,y;
点(){}
点(常数int&x,常数int&y){}
};
点运算符+(常量点&p1,常量点&p2){return{p1.x+p2.x,p1.y+p2.y};}
点p1,p2;
函数fn=[]返回p1;};
int main()
{
点p3=fn()+p2;
返回0;
}

[]{return p1;}
按值返回,因此
fn()
返回一个悬空引用。

p2
未初始化?将ctor更改为Point():x{},y{}{},以确保Point的对象在默认情况下已初始化。噢。std::function没有指定返回类型吗?我明白了。是的,但lambda没有。对吗?将lambda和
std::function
视为独立的东西(因为它们是独立的)。
std::function
的返回类型与lambda的返回类型不相关。lambda通过值返回
p1
,然后
std::函数尝试返回对该值的引用。
std::function<const Point&()> fn = []{ return p1; };
std::function<const Point&()> fn = []{ return p1; };
std::function<const Point&()> fn = []() -> const Point& { return p1; };