gpt4 book ai didi

c++ - 作为成员变量的 lambda 函数崩溃

转载 作者:可可西里 更新时间:2023-11-01 17:11:17 26 4
gpt4 key购买 nike

montecarlo 类包含 lambda 作为成员变量。此代码可以编译,但会在运行时导致“Segmentation fault(core dumped)”。您能解释一下如何修复它吗?

#include<random>
#include<functional>
#include<iostream>

class montecarlo
{
public:
montecarlo(double x_min, double x_max);
std::function<double()> rand;
};

montecarlo::montecarlo(double x_min, double x_max){
std::random_device rd;
std::mt19937 mt(rd());
std::uniform_real_distribution<double> rand_(x_min, x_max);
rand = [&](){return rand_(mt);};
}

int main(){
montecarlo x(0, 1);
std::cout<<x.rand()<<std::endl;
}

让我感到奇怪的是,当我将构造函数的实现更改为下面的代码时,它起作用了:

montecarlo::montecarlo(double x_min, double x_max){
rand = [](){return 0;};
}

你可能知道,但让我说我想做的不仅仅是使用随机函数。

最佳答案

您正在尝试通过引用捕获 rand_mt;它们是 montecarlo::montecarlo 内部的本地对象,当在 montecarlo::montecarlo 外部调用 lambda 时,这些本地对象已被销毁并且存储在 lambda 对象中的引用已变为悬空.

您可以将其更改为通过复制捕获;并注意您需要使 lambda 可变 以使对 rand_ 的调用有效。例如

rand = [=]() mutable {return rand_(mt);};

关于c++ - 作为成员变量的 lambda 函数崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51148554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com