В C ++ 11, вы можете передать ref'ed базовый класс в конструктор потока и получить полиморфное поведение? - PullRequest
8 голосов
/ 29 марта 2012

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

Я бы попробовал это с 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;
}

1 Ответ

2 голосов
/ 30 марта 2012

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

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

...