Offensichtlich ist es möglich, einen rvalue Verweis auf std::thread
Konstruktor zu übergeben. Mein Problem ist mit der Definition dieses Konstruktors in cppreference. Er sagt, dass dieser Konstruktor:wie std :: thread-Konstruktor rvalue-Referenz erkennt?
template< class Function, class... Args >
explicit thread(Function&& f, Args&&... args);
Erstellt neues std :: Thread-Objekt und verbindet sie mit einem Faden von Ausführung. Zunächst werden die Konstruktor Kopien/verschiebt alle Argumente (sowohl die Funktionsobjekt f und alle args ...) einzufädeln zugänglichen Speicher als ob durch die Funktion:
template <class T>
typename decay<T>::type decay_copy(T&& v) {
return std::forward<T>(v);
}
Soweit ich überprüfen kann:
std::is_same<int, std::decay<int&&>::type>::value
gibt wahr zurück. Dies bedeutet, std::decay<T>::type
wird Rvalue Referenzteil des Arguments fallen lassen. Dann, wie std::thread
Konstruktor weiß, welches Argument von Lvalue oder Rvalue Referenzen übergeben wird? Da alle T&
und T&&
wird T
von std::decay<T>::type
"Wendet lvalue-to-rvalue, array-to-pointer und implizite function-to-pointer-Konvertierungen auf den Typ T an, entfernt cv-qualifiers und definiert den resultierenden Typ als Member typedef-Typ" http: // de.cppreference.com/w/cpp/types/decay - wo siehst du, dass Referenzen fallen? – xaxxon
@xaxxon fehlt Ihnen ':: type'. –
@ T.C. entfernt - aber warum sind sie gleich? – xaxxon