2012-03-29 8 views
8

Zauważyłem różnicę w zachowaniu między nową biblioteką w Visual Studio 11 Beta i Boost z thread() i ref(). Zastanawiam się, kto ma rację. Mogłoby to być zarówno, gdyby standard odstąpił od pierwotnej implementacji Boosta. (Ale nie mam zamiaru próbować odszyfrować standardowego ...)Czy w C++ 11 możesz przekazać odwołaną klasę podstawową do konstruktora wątku i uzyskać polimorficzne zachowanie?

Próbowałbym tego z MinGW ... Niestety, AFAIK, < wątek > nie działa dla MinGW.

Pierwsze pytanie brzmi: czy gcc i Clang wykazują taką samą awarię kompilacji? Jeśli tego nie zrobię, zgłoszę błąd przeciwko VS. Drugie pytanie może być, jeśli błąd kompilacji jest poprawny, jaki jest mój sposób obejścia tego, co dostałem od Boost (w skrócie do korzystania z Boost)?

I przypuszczam, że mam trzecie pytanie ... Czy to, co robię, jest koszerne?

class base 
{ 
public: 
    virtual void operator()() = 0; 
}; 

class derived : public base 
{ 
public: 
    virtual void operator()() 
    { 
     cout << "derived" << endl; 
    } 
}; 

int main() 
{ 
    base *b = new derived; 

    std::thread t(std::ref(*b)); // Nasty compilation errors. 

    boost::thread t(boost::ref(*b)); // Works fine. 

    t.join(); 

    return 0; 
} 
+3

clang -stdlib = libC++ -std = C++ 11 kompiluje i wypisuje "pochodne". Jaki błąd widzisz? –

+0

g ++ -std = C++ 0x -lpthread również kompiluje i mimo że nie widzę żadnego bezpośredniego użycia dla polimorficznych wątków, nie ma w tym nic złego. – stefaanv

+0

Dzięki za pomoc, chłopaki. Złożę błąd na VS i, mam nadzieję, potwierdzą. – screwnut

Odpowiedz

2

I złożony bug przeciwko Visual Studio 11 Beta here. Jeszcze nie ma statusu. Dokonam edycji tego postu ze statusem, gdy go otrzymam.

Edycja: Naprawiono w VS 2015 RTM, zgodnie z aktualizacją w raporcie o błędzie.

Powiązane problemy