Tại sao bạn không thể truyền đối tượng theo tham chiếu khi tạo std::thread
?Truyền đối tượng bằng tham chiếu đến std :: thread in C++ 11
Ví dụ snippit sau đưa ra một lỗi biên dịch:
#include <iostream>
#include <thread>
using namespace std;
static void SimpleThread(int& a) // compile error
//static void SimpleThread(int a) // OK
{
cout << __PRETTY_FUNCTION__ << ":" << a << endl;
}
int main()
{
int a = 6;
auto thread1 = std::thread(SimpleThread, a);
thread1.join();
return 0;
}
Lỗi:
In file included from /usr/include/c++/4.8/thread:39:0,
from ./std_thread_refs.cpp:5:
/usr/include/c++/4.8/functional: In instantiation of ‘struct std::_Bind_simple<void (*(int))(int&)>’:
/usr/include/c++/4.8/thread:137:47: required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (&)(int&); _Args = {int&}]’
./std_thread_refs.cpp:19:47: required from here
/usr/include/c++/4.8/functional:1697:61: error: no type named ‘type’ in ‘class std::result_of<void (*(int))(int&)>’
typedef typename result_of<_Callable(_Args...)>::type result_type;
^
/usr/include/c++/4.8/functional:1727:9: error: no type named ‘type’ in ‘class std::result_of<void (*(int))(int&)>’
_M_invoke(_Index_tuple<_Indices...>)
^
Tôi đã thay đổi để đi qua một con trỏ, nhưng là có một công việc tốt hơn xung quanh?
Việc bắt giữ, hợp lý, giá trị mặc định để nắm bắt bởi giá trị bởi vì nếu không mọi thứ sẽ thất bại khủng khiếp nếu tham số ra đi trước khi các chủ đề có thể đọc nó. Bạn cần yêu cầu rõ ràng hành vi này để có điều gì đó cho biết rằng bạn đang giả định trách nhiệm đảm bảo rằng đích của tham chiếu vẫn hợp lệ. –
Tuyệt vời! Tôi đã hy vọng có một cách để vượt qua một tham chiếu một cách rõ ràng. C++ 11 để giải cứu một lần nữa :) – austinmarton