當給 thread 的執行函數傳遞指針參數時,沒有任何問題,可是若是想傳遞引用,按照普通函數的調用方法會遇到編譯失敗:ios
1 #include <iostream> 2 #include <thread> 3 #include <string> 4 5 int main() 6 { 7 std::string a("Hello"); 8 std::cout << "address = " << &a << "\n"; 9 std::thread t([](std::string& a) 10 { 11 std::cout << "in thread address = " << &a << "\n"; 12 }, a); 13 t.join(); 14 }
編譯:g++ -std=c++11 -pthread test.cpp
失敗了:c++
In file included from /usr/include/c++/4.7/bits/move.h:57:0, from /usr/include/c++/4.7/bits/stl_pair.h:61, from /usr/include/c++/4.7/bits/stl_algobase.h:65, from /usr/include/c++/4.7/bits/char_traits.h:41, from /usr/include/c++/4.7/ios:41, from /usr/include/c++/4.7/ostream:40, from /usr/include/c++/4.7/iostream:40, from test.cpp:1: /usr/include/c++/4.7/type_traits: In instantiation of ?.truct std::_Result_of_impl<false, false, main()::<lambda(std::string&)>, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >?. /usr/include/c++/4.7/type_traits:1857:12: required from ?.lass std::result_of<main()::<lambda(std::string&)>(std::basic_string<char>)>? /usr/include/c++/4.7/functional:1563:61: required from ?.truct std::_Bind_simple<main()::<lambda(std::string&)>(std::basic_string<char>)>? /usr/include/c++/4.7/thread:133:9: required from ?.td::thread::thread(_Callable&&, _Args&& ...) [with _Callable = main()::<lambda(std::string&)>; _Args = {std::basic_string<char, std::char_traits<char>, std::allocator<char> >&}]? test.cpp:12:7: required from here /usr/include/c++/4.7/type_traits:1834:9: error: no match for call to ?.main()::<lambda(std::string&)>) (std::basic_string<char>)? test.cpp:9:17: note: candidates are: In file included from /usr/include/c++/4.7/bits/move.h:57:0, from /usr/include/c++/4.7/bits/stl_pair.h:61, from /usr/include/c++/4.7/bits/stl_algobase.h:65, from /usr/include/c++/4.7/bits/char_traits.h:41, from /usr/include/c++/4.7/ios:41, from /usr/include/c++/4.7/ostream:40, from /usr/include/c++/4.7/iostream:40, from test.cpp:1: /usr/include/c++/4.7/type_traits:1834:9: note: void (*)(std::string&) {aka void (*)(std::basic_string<char>&)} <conversion> /usr/include/c++/4.7/type_traits:1834:9: note: candidate expects 2 arguments, 2 provided test.cpp:9:33: note: main()::<lambda(std::string&)> test.cpp:9:33: note: no known conversion for argument 1 from ?.td::basic_string<char>?.to ?.td::string& {aka std::basic_string<char>&}?
這裏相似於 std::bind,std::thread 和 std::bind 採用了相同的機制,必須使用 std::ref 來包裝:ide
1 #include <iostream> 2 #include <thread> 3 #include <string> 4 5 int main() 6 { 7 std::string a("Hello"); 8 std::cout << "address = " << &a << "\n"; 9 std::thread t([](std::string& a) 10 { 11 std::cout << "in thread address = " << &a << "\n"; 12 }, std::ref(a)); 13 t.join(); 14 }