创建调用成员函数的线程时,传递指向当前类的指针和传递引用之间有区别吗?
从下面的例子来看,方法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,通常会考虑将缺陷应用于所有方言并"修复"实现。缺陷是"我们现在说的一直都是这样"的东西