( this ) 和 ( std::ref(*this) ) 有什么区别

What's the difference between ( this ) and ( std::ref(*this) )

我以前也是这样创建线程的

std::thread(&A::Func, this);

但我发现还有另一种方式

std::thread(&A::Func, std::ref(*this));

它们有什么区别?

std::ref 是一个真正的引用,这意味着如果您在您启动的线程上访问它,它也会更改另一个线程上的对象。另一种方式也是如此。指针也可以做到这一点,但编译器可能会有不同的处理方式。只是一个忠告:你应该小心从两个线程访问一个对象并使用 std::mutex.

在启动线程 运行 class A 的成员函数的上下文中,这些调用是等效的。

第一个喜欢

void compiler_created_on_new_thread(A * a) { a->Func(); }

第二个像

void compiler_created_on_new_thread(A & a) { a.Func(); }

如果 A 是一个命名空间,它们将是可区分的

namespace A {
    void Func(Thing *) { std::cout << "pointer"; }
    void Func(Thing &) { std::cout << "reference"; }
}

第一个显示“指针”,第二个显示“引用”