2012-03-29 2 views
8

Я наблюдал разницу в поведении новой библиотеки в Visual Studio 11 Beta и Boost с помощью thread() и ref(). Мне интересно, кто прав. Это может быть и то, и другое, если стандарт отклонился от первоначальной реализации Boost. (Но я не собираюсь пытаться расшифровывать стандартные ...)В C++ 11 вы можете передать базовый класс ref's в конструктор потока и получить полиморфное поведение?

Я бы попробовал это с MinGW ... Увы, AFAIK, < нить > не работает для MinGW.

Итак, первый вопрос: у gcc и Clang есть тот же отказ компиляции? Если они этого не сделают, я напишу ошибку против VS. Второй вопрос может заключаться в том, что если ошибка компиляции верна, то каково мое обходное решение, чтобы получить то, что дал мне 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 компилирует и выводит «производные». Какую ошибку вы видите? –

+0

g ++ -std = C++ 0x -lpthread также компилируется и, хотя я не вижу прямого использования для полиморфных потоков, в этом нет ничего злого. – stefaanv

+0

Спасибо за помощь, ребята. Я напишу ошибку на VS и, надеюсь, подтвердят. – screwnut

ответ

2

Я подал ошибку против Visual Studio 11 Beta here. Пока нет статуса. Будет ли редактировать этот пост со статусом, когда я его получу.

Редактировать: Исправлено в VS 2015 RTM, согласно обновлению в отчете об ошибке.

Смежные вопросы