我已经对新的C++ 11右值做了相当多的研究,并通过左值继承。 这里是什么,我已经找到并阅读样本:std ::线程构造函数在使用类成员函数时通过引用传递
what-does-t-double-ampersand-mean-in-c11
我也介绍了自己的右值引用
具体而言,关于std::thread
构造,我发现
和所使用的ANSW之一ERS写一些简单的代码
#pragma once
#ifndef CONSUMER_H
#define CONSUMER_H
#include "Mailbox.h"
#include <thread>
#include <iostream>
class Consumer
{
private:
Mailbox mailbox;
std::thread consumer;
public:
Consumer(Mailbox& newMailbox);
~Consumer();
void operator()() { std::cout << consumer.get_id() << "starting\n"; }
void start();
void run();
};
Consumer::Consumer(Mailbox& newMailbox)
{
this->mailbox = newMailbox;
}
void Consumer::start()
{
consumer = std::thread(&Consumer::run, this); <-- need understanding
}
#endif
检查'的std :: thread构造函数的
我观察到,使用右值参数的模板。据我所知,std::thread
可以通过一个简单的例子
void run(void) {std::cout << "I'm running";}
std::thread(run);
,直到我是一个类的内部,由此,我需要做下面的
consumer = std::thread(&Consumer::run, this); <-- need understanding
,因为我从乔纳森Wakely了解到这似乎直截了当启动run()是一个非静态成员函数,必须在一个对象上运行。如果你不告诉它,新线程应该如何知道哪个对象要调用它?
这是有道理的,但需要通过引用类函数没有,因为我看到A a; A&& ref = A()
可能。我对rvalues超级困惑,只是想了解为什么我上面写的代码有必要将函数传递给std::thread
。
我觉得肯定我也不明白variadic模板,以及要么使我了解std::thread
可变模板构造函数的化合物。
的符号在'消费=的std ::线程(消费者::运行,这一点);'无关做参考。这是一个地址 - 运算符,需要形成[指向成员函数](http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_member_functions) –
@IgorTandetnik同样的事情; 'int age = 45; int&rage = age是对age的引用,并且引用返回一个指针,但是下面的int age = 45; int * page = &age; int && sage = page;'不是真的,所以我仍然感到困惑。 – Mushy
你是什么意思“和一个引用返回一个指针”?这对我来说毫无意义,对不起。 'age'和'rage'都不是指针。而'int && sage = page;'不会编译。 –