C++ ';非标准语法;使用'&';要创建指向成员的指针';带螺纹

C++ ';非标准语法;使用'&';要创建指向成员的指针';带螺纹,c++,multithreading,class,C++,Multithreading,Class,因此,我尝试从我创建的类中为两个函数创建一个线程: MessagesSender all; std::thread t1(all.updateMessages); std::thread t2(all.sendMessages); 但当我尝试编译时,它会显示以下错误: 非标准语法;使用“&”创建指向成员的指针 为什么???你应该做什么 std::thread t1(&MessagesSender::updateMessages, MessagesSender()); .

因此,我尝试从我创建的类中为两个函数创建一个线程:

MessagesSender all;
    std::thread t1(all.updateMessages);
    std::thread t2(all.sendMessages);
但当我尝试编译时,它会显示以下错误: 非标准语法;使用“&”创建指向成员的指针

为什么???

你应该做什么

std::thread t1(&MessagesSender::updateMessages, MessagesSender());
...
...
t1.join();
对于任何其他成员函数也是如此

如果要使用同一对象,请通过引用传递该对象

std::thread t1(&MessagesSender::updateMessages, std::ref(myMessageSenderobj));

线程
构造函数:

thread( thread&& other ) noexcept;

template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );

thread(const thread&) = delete;

会有帮助的。我怀疑你的MessagesSender中有一个bug。@Yksisarvinen确实存在,而且当前代码是未定义的行为,因为临时代码将立即被销毁。我必须在其中两个代码中使用具有相同数据的对象。@Yksisarvinen我已更新了我的答案。@Arthur Tacca我不同意这是未定义的行为。线程构造函数的参数被复制了。哦,你是对的,我错了。谢谢你的澄清。(实际上,如果它是一个右值引用,它会移动,就像在本例中一样,但要点是相同的:它实例化一个新对象目标,而不是引用一个现有对象。)
... t1(&MessagesSender::updateMessages ...