std::bind
和std::thread
共享一些设计原则。由于它们都存储与传递参数对应的本地对象,如果需要引用语义,我们需要使用std::ref
或std::cref
:
void f(int& i, double d) { /*...*/ }
void g() {
int x = 10;
std::bind(f, std::ref(x), _1) (3.14);
std::thread t1(f, std::ref(x), 3.14);
//...
}
但是我对最近的个人发现感到好奇:即使这不是通常想要的情况,std::bind
仍然允许你传递一个值。
std::bind(f, x, _1) (3.14); // Usually wrong, but valid.
然而,这并不适用于
std::thread
。以下内容将会触发编译错误。 std::thread t2(f, x, 3.14); // Usually wrong and invalid: Error!
乍一看我以为这是编译器的bug,但错误确实是合法的。似乎由于30.3.1.2所施加的复制衰减要求(将
int&
转换为int
),模板化版本的std::thread
构造函数无法正确推导参数。
问题是:为什么不要求类似于std::bind
的参数?或者这个明显的不一致是有意的吗?
注意:在下面的评论中解释了为什么这不是重复的。