我已經對新的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;'不會編譯。 –