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);
//...
}
Run Code Online (Sandbox Code Playgroud)
但我对最近的个人发现很感兴趣:std::bind即使这不是人们通常想要的,也会允许你在上面的案例中传递一个值.
std::bind(f, x, _1) (3.14); // Usually wrong, but valid.
Run Code Online (Sandbox Code Playgroud)
但是,事实并非如此std::thread.以下将触发编译错误.
std::thread t2(f, x, 3.14); // Usually wrong and invalid: Error!
Run Code Online (Sandbox Code Playgroud)
乍一看,我认为这是一个编译器错误,但错误确实合法.看来的模板版本std::thread的构造函数是无法正确推断的参数,由于副本腐烂 要求(tranforming int&在int通过30.3.1.2规定).
问题是:为什么不要求类似于std::bind论点的东西?或者这是否明显不一致?
注意:解释为什么它在下面的评论中不重复.