std::thread constructor传递指针和通过引用传递有区别吗



创建调用成员函数的线程时,传递指向当前类的指针和传递引用之间有区别吗?

从下面的例子来看,方法1的行为与方法2相同吗?有什么不同吗?

class MyClass
{
public:
    MyClass(){};
    ~MyClass(){};
    void memberFunction1()
    {
        //method 1
        std::thread theThread(&MyClass::memberFunction2, this, argumentToMemberFunction2)
        //method 2
        std::thread theThread(&MyClass::memberFunction2, std::ref(*this), argumentToMemberFunction2)
    }
    void memberFunction2(const double& someDouble){};
}

没有,没有区别,但请注意,只有在2015年10月WG21会议上接受LWG 2219作为缺陷报告后,才有可能使用参考包装。*

在有命名对象实例而不是this的情况下,使用std::ref可能会有所帮助,因为this很容易拼写。但是考虑以下情况,在这种情况下,您希望保持良好的常量正确性:

A a;
std::thread(&A::foo, std::cref(a), 1, 2);

这可能比更容易阅读

std::thread(&A::foo, &(const_cast<const A&>(a)), 1, 2);
std::thread(&A::foo, &as_const(a), 1, 2);
std::thread(&A::foo, const_cast<const A*>(&a), 1, 2);

*)保留不同语言方言的供应商,如GCC和带有-std标志的Clang,通常会考虑将缺陷应用于所有方言并"修复"实现。缺陷是"我们现在说的一直都是这样"的东西

最新更新