C++多线程中,明确说明std::thread对象可以移动不能拷贝,
但是有的地方有这样写道:
class X{
std::thread &t;
public:
explicit X(std::thread& t_) : t(t_) {}
...
}
std::thread t(...);
X g(t);
那么在创建g对象时不是就对t进行引用了吗?是可以这样吗?
C++多线程中,明确说明std::thread对象可以移动不能拷贝,
但是有的地方有这样写道:
class X{
std::thread &t;
public:
explicit X(std::thread& t_) : t(t_) {}
...
}
std::thread t(...);
X g(t);
那么在创建g对象时不是就对t进行引用了吗?是可以这样吗?
都在答非所问,题主你的疑虑是既然thread只能移动不能拷贝,为什么库里面有些类的构造函数参数用了thread的引用。
首先你要知道引用不是拷贝,引用&表示用一个新的引用变量指向这个对象,对象本身没有做任何拷贝动作,只是多了一个东西指向他,那么其实你的疑虑根本是不矛盾的,thread不支持拷贝并不代表不能引用。
其次,为什么要用引用不用移动,移动意味着提供一种能力可以将原来的对象内容转移到新的对象里,原来的对象内容就空了(通常移动构造函数这么写),显然,如果原来的对象是个左值(如你提供的例子,t是个左值),移动是不合理的,否则移动后这个对象t被其他代码用怎么办? 其实你可以用std::move显式地让class X接受t并调用其移动构造函数,但是这个操作不合理。那么你的问题其实很简单,库函数如果不提供引用的支持,意味着它只接受右值,这对于这个库来说适用性太低了,所以非特殊情况根本不可能,提供引用是普适做法,在此基础上提供移动语义是锦上添花,对于右值来说能提高效率