2015-12-03 31 views
14

yılında iplik std için? Örneğinreferans olarak nesneyi Geçme :: C++ 11

aşağıdaki snippit bir derleme hatası verir:

#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; 
} 

Hata:

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...>) 
     ^

Ben bir işaretçi geçirmeden değiştirdik, ancak daha iyi bir çalışma etrafında var mı?

cevap

25

açıkça bir reference_wrapper by using std::ref ile iplik başlatmak: (uygun şekilde veya std::cref yerine std::ref,)

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

. cppreference on std:thread gelen notlar başına: iplik okumak edemeden parametre uzağa giderse aksi şeyler korkunç başarısız olur çünkü

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

yakalama, mantıklı, varsayılan değerine göre yakalamak için. Eğer referans hedef hala geçerli olmasını sağlamak için sorumluluk belirtmek için bir şey var ki açıkça bu davranış için sormak gerekir. –

+0

Mükemmel! Ben açıkça bir başvuru iletmek için bir yol olduğunu umuyordum. C++ 11 tekrar kurtarma için :) – austinmarton