2015-12-03 14 views
14

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?

Trả lời

25

Rõ ràng khởi tạo thread với một reference_wrapper by using std::ref:

auto thread1 = std::thread(SimpleThread, std::ref(a)); 

(hoặc std::cref thay vì std::ref, nếu thích hợp). Mỗi ghi chú từ cppreference on std:thread:

The arguments to the thread function are moved or copied by value. If a reference argument needs to be passed to the thread function, it has to be wrapped (e.g. with std::ref or std::cref).

+8

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ệ. –

+0

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

Các vấn đề liên quan