como o construtor std :: thread detecta a referência rvalue?

Obviamente, é possível passar uma referência rvalue parastd::thread construtor. Meu problema é com a definição desse construtor emcppreference. Diz que este construtor:

template< class Function, class... Args >
explicit thread( Function&& f, Args&&... args );

Cria o novo objeto std :: thread e o associa a um thread de execução. Primeiro, o construtor copia / move todos os argumentos (o objeto de função f e todos os argumentos ...) para o armazenamento acessível por thread, como se fosse a função:

template <class T>
typename decay<T>::type decay_copy(T&& v) {
    return std::forward<T>(v);
}

Tanto quanto eu posso verificar:

std::is_same<int, std::decay<int&&>::type>::value

retorna verdadeiro. Isso significastd::decay<T>::type eliminará parte da referência rvalue do argumento. Então comostd::thread O construtor sabe que argumento é passado por referências lvalue ou rvalue? Porque todosT& eT&& será convertido paraT porstd::decay<T>::type

questionAnswers(3)

yourAnswerToTheQuestion