了解std::bind
和std::thread
,我注意到这一点"不一致"错误行为https://godbolt.org/g/5t5uOu:
class Widget{
};
void start_thread1(int ¶m){
}
void start_thread2(std::vector<int> ¶m){
}
void start_thread3(Widget &w){
}
int main(){
int int_data = 3;
std::vector<int> vec_data;
Widget widget_data;
std::thread t(start_thread1, int_data); // MSVC Error
//std::thread t(start_thread2, vec_data); //No MSVC Error
//std::thread t(start_thread3, widget_data); //No MSVC Error
t.join();
}
GCC和Clang对这三种情况都给出了错误 如果我尝试
std::bind t(start_thread1,int_data); //and the other two
代码编译得很好
我知道您应该使用std::ref
来获取reference_wrapper并按值传递它,但我不明白为什么代码在一个案例中编译而不在另一个案例中编译。有人可以解释为什么它使用bind而不是线程编译好,以及它为什么不用start_thread1
编译?