gpt4 book ai didi

c++ - 使用 t( *this ) 会导致 RuntimeError,而 t( std::ref( *this ) 不会

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

我有以下示例:

#include <iostream>
#include <functional>

struct Tmr {
typedef std::function<void(void)> Callback;
Callback cb;

Tmr(Callback cb_) :
cb( cb_ )
{
}

void timeout()
{
cb();
}
};

struct Obj {
struct Tmr t;

Obj() :
t( std::ref( *this ) )
{
}

void operator () ()
{
std::cout << __func__ << '\n';
}
};

int main(int argc, char *argv[])
{
Obj o;

o.t.timeout();

return 0;
}

这运行良好,但最初我将 Obj 的构造函数设置为:

Obj() :
t( *this )

这会导致运行时错误。我猜这是因为我的回调中只存储了对成员函数的引用,而不是调用成员的对象。

我不明白的是当我执行 Obj() : t(std::ref(*this))std::ref 做了什么以及为什么这使程序工作。任何人都可以阐明正在发生的事情及其运作方式吗?

最佳答案

当您不通过引用传递时,您将在 t 初始化之前复制 *this - 这意味着您正在复制 t 及其回调成员在初始化之前,这是未定义的行为。

(std::function 的复制构造函数很可能会尝试复制未初始化指针指向的内容,这就是导致实际崩溃的原因。)

关于c++ - 使用 t( *this ) 会导致 RuntimeError,而 t( std::ref( *this ) 不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34826321/

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