2015-08-27 2 views
0

std::move ne compile pas lorsque vous déplacez un objet std::packaged_task<void()>.std :: move de std :: packaged_task <void()> ne compile pas (vs2013)

les erreurs sont les suivantes:

erreur C2182: '_Get_value': utilisation illégale de type 'vide'
erreur C2182: '_Val': utilisation illégale de type 'vide'
erreur C2182: '_Val' : utilisation illégale de type 'vide' erreur C2665: 'std :: avant': aucun des 2 surcharges pourrait convertir tous les types d'arguments
erreur C2512: 'std :: _ Promise': pas de constructeur par défaut approprié disponible

Le code est:

struct CalcFib 
{ 
    int m_num; 
    int m_res; 
    CalcFib(int number) :m_num(number) 
    { 

    } 

    CalcFib() :m_num(0) 
    { 

    } 

    void operator()() 
    { 
     m_res = fib(m_num); 
    } 

    int fib(int num) 
    { 
     if (num < 2) return num; 
     else return fib(num - 1) + fib(num - 2); 
    } 

}; 

std::packaged_task<void()> task(std::move(CalcFib(30))); 

std::packaged_task<void()> task1 = std::move(task); 

Ce code est compilé avec succès:

struct CalcFib 
{ 
    int m_num; 
    int m_res; 
    CalcFib(int number) :m_num(number) 
    { 

    } 

    CalcFib() :m_num(0) 
    { 

    } 

    int operator()() 
    { 
     m_res = fib(m_num); 
     return m_res; 
    } 

    int fib(int num) 
    { 
     if (num < 2) return num; 
     else return fib(num - 1) + fib(num - 2); 
    } 

}; 

std::packaged_task<int()> task(std::move(CalcFib(30))); 

std::packaged_task<int()> task1 = std::move(task); 

similar issue was asked here but has not answer

+0

Pouvez-vous ajouter la version du compilateur et système? Cela compile bien avec clang 3.4.1 ('-std = C++ 11') et gcc 4.8.5. – dhke

+0

Microsoft (R) C/C++ Optimisation du compilateur version 18.00.40629 pour x86 – aviyaChe

+0

Ceci est un bug du compilateur Visual Studio, une solution agréable fount [ici] [1] [1]: http: // stackoverflow.com/questions/14744588/why-is-stdpackaged-taskvoid-not-valid – aviyaChe

Répondre

0

C'est bug du compilateur Visual Studio, j'ai trouvé une bonne solution en mettant en place packaged_task here