vetor de std :: threads

C ++ 11

Estou tentando fazer umavector dostd::threads. A combinação dos três pontos seguintes diz que eu posso.

1.) De acordo comhttp://en.cppreference.com/w/cpp/thread/thread/thread, threadO construtor padrão cria um

objeto thread que não representa um thread.

2.) De acordo comhttp://en.cppreference.com/w/cpp/thread/thread/operator%3D, thread'Soperator=

Atribui o estado de [o parâmetro, que é uma referência rvalue de thread] ao [thread de chamada] usando a semântica de movimentação.

3.) De acordo comhttp://en.cppreference.com/w/cpp/container/vector/vector, passando apenas uma variável de tipo de tamanho para um construtor de vetor irá construir

o contêiner com as instâncias de [o número especificado de] inicializado por valor (padrão construído, para classes) de T. Nenhuma cópia é feita.

Então eu fiz isso:

#include <iostream>
#include <thread>
#include <vector>

void foo()
{
    std::cout << "Hello\n";
    return;
}

int main()
{
    std::vector<std::thread> vecThread(1);
    vecThread.at(0) = std::thread(foo);
    vecThread.at(0).join();
    return 0;
}

Isso é executado como esperado em VC11 eg ++ 4.8.0 (compilador online aqui) como visto no seguinte:

Saída do Console:

Hello

Então eu tentei no clang 3.2, alternando o menu do compilador na mesma página, o que dá:

stderr: 
pure virtual method called
terminate called without an active exception

Quando um objeto de thread - que representa um thread - sai do escopo antes de serjoin()ed oudetach()ed, o programa será forçado a terminar. eu tenhojoin()edvecThread.at(0), então a única coisa que resta em questão é o encadeamento temporário

std::thread(foo);

no

vecThread.at(0) = std::thread(foo);

tarefa.

No entanto, de acordo com a referência da Web, os encadeamentos só podem ser atribuídos movendo uma referência rvalue de encadeamento. Eu não consigo pensar em nenhuma maneira dejoin() oudetach() um objeto de thread temporário.

Então, se a saída do clang está correta, então qual é o uso dethread'Soperator=? Ou isso é um bug do compilador clang?

Em g ++ 4.8.0, mudando a linha

vecThread.at(0) = std::thread(foo)

para

vecThread.at(0) = std::thread{foo}

(substituindo parênteses por chaves) ainda dá o esperadoHello saída.

No entanto, mudando a linha paravecThread.at(0) = {foo} faz reclamar:

queixa de g ++ 4.8.0 sobre chaves:

erro: converter para 'std :: thread' da lista de inicializadores usaria o construtor explícito 'std :: thread :: thread (_Callable &&, _Args && ...) [com _Callable = void (&) (); _Args = {}} 'vecThread.at (0) = {foo};

que é muito avançado - não sei o que isso significa.

Fazendo a mesma mudança no clang dá o ainda mais avançado:

queixa do clang 3.2 em chaves:

error: no viable overloaded '='
vecThread.at(0) = {foo};
...
note: candidate function not viable: cannot convert initializer list
argument to 'const std::thread'
thread& operator=(const thread&) = delete;
...
note: candidate function not viable: cannot convert initializer list
argument to 'std::thread'
thread& operator=(thread&& __t) noexcept

e eu também não sei o que isso significa.

Eu não posso usar o VC11 para corroborar o acima

vecThread.at(0) = {foo}

problemas porque o VC11, a partir do compilador CTP de novembro de 2012, não suporta a sintaxe de inicialização uniforme na Biblioteca Padrão.

questionAnswers(1)

yourAnswerToTheQuestion