2012-03-29 14 views
8

我觀察到Visual Studio 11 Beta中的新庫和thread()和ref()之間的行爲差​​異。我想知道誰是對的。如果標準偏離了Boost原始實施的標準,則可能兩者都有。 (但我不打算破譯standardese ...)在C++ 11中,您能否將ref'ed基類傳遞給線程的構造函數並獲得多態行爲?

我會用MinGW試過它...唉,AFAIK,<線程>不適用於MinGW。

因此,第一個問題是,gcc和Clang是否展示相同的編譯失敗?如果他們不這樣做,我會向VS提交一個bug。第二個問題可能是,如果編譯失敗是正確的,我的解決方法是什麼讓Boost給我(短暫繼續使用Boost)?

而且我想我還有第三個問題......我在做什麼甚至猶太教開始?

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編譯並打印出「derived」。你看到什麼錯誤? – 2012-03-29 14:00:15

+0

g ++ -std = C++ 0x -lpthread也可以編譯並且儘管我沒有看到多態線程的任何直接使用,但沒有什麼壞處。 – stefaanv 2012-03-29 14:14:49

+0

感謝您的幫助,夥計們。我會在VS上提交一個bug,希望他們能夠證實。 – screwnut 2012-03-29 18:20:51

回答

2

我提交了一個針對Visual Studio 11 Beta here的錯誤。還沒有身份。當我得到它時,將會以狀態編輯這篇文章。

編輯:根據錯誤報告中的更新在VS 2015 RTM中修復。

相關問題