2017-10-11 92 views
1

我已经对新的C++ 11右值做了相当多的研究,并通过左值继承。 这里是什么,我已经找到并阅读样本:std ::线程构造函数在使用类成员函数时通过引用传递

what-does-t-double-ampersand-mean-in-c11

how-stdthread-constructor-detects-rvalue-reference

stdthread-and-rvalue-reference

我也介绍了自己的右值引用

Move_Semantics

rvalue_references

A Proposal to Add an Rvalue Reference to the C++ Language

具体而言,关于std::thread构造,我发现

how-to-create-a-thread-inside-a-class-function

和所使用的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::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可变模板构造函数的化合物。

+1

的符号在'消费=的std ::线程(消费者::运行,这一点);'无关做参考。这是一个地址 - 运算符,需要形成[指向成员函数](http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_member_functions) –

+0

@IgorTandetnik同样的事情; 'int age = 45; int&rage = age是对age的引用,并且引用返回一个指针,但是下面的int age = 45; int * page = &age; int && sage = page;'不是真的,所以我仍然感到困惑。 – Mushy

+0

你是什么意思“和一个引用返回一个指针”?这对我来说毫无意义,对不起。 'age'和'rage'都不是指针。而'int && sage = page;'不会编译。 –

回答

2

我观察一个使用右值参数的模板。

不,std::thread构造函数使用转发引用,这意味着它们可以接受任何类型的参数并根据参数类型推断左值或右值引用。

阅读forwarding referencesUniversal References in C++11(Scott Meyers为这些名字引入了“universal reference”,但官方名称现在是“forwarding reference”)。

这有一定的道理,但需要通过引用传递类功能不

你困惑,&Consumer::run没有任何类型的参考。作为类型名称的一部分的符号&意味着引用,但是当它在表达式的左边变成它时,它是形成指针的“地址”操作符。在这种情况下,它正在形成pointer to member function

表达式std::thread(&Consumer::run, this)构造一个带有两个参数的线程,一个指向应该在新线程中运行的成员函数的指针,以及一个指向成员函数将被调用的对象的指针。因此,在新的线程,这样的事情发生了:

auto pointer_to_member_function = &Consumer::run; 
auto pointer_to_object = this; 
(pointer_to_object->.pointer_to_member_function)(); 

这相当于跑步this->run()

相关问题