std::packaged_task<R(Args...)>:: packaged_task
|
packaged_task
(
)
noexcept
;
|
(1) | (seit C++11) |
|
template
<
class
F
>
explicit packaged_task ( F && f ) ; |
(2) | (seit C++11) |
|
template
<
class
F,
class
Allocator
>
explicit packaged_task ( std:: allocator_arg_t , const Allocator & a, F && f ) ; |
(3) |
(seit C++11)
(bis C++17) |
|
packaged_task
(
const
packaged_task
&
)
=
delete
;
|
(4) | (seit C++11) |
|
packaged_task
(
packaged_task
&&
rhs
)
noexcept
;
|
(5) | (seit C++11) |
Konstruiert ein neues
std::packaged_task
-Objekt.
std::packaged_task
-Objekt ohne Aufgabe und ohne gemeinsamen Zustand.
std::packaged_task
-Objekt mit einer gespeicherten Aufgabe vom Typ
std::
decay
<
F
>
::
type
und einem gemeinsamen Zustand. Die gespeicherte Aufgabe wird mit
std::
forward
<
F
>
(
f
)
initialisiert.
|
Diese Überladungen nehmen nur dann an der Überladungsauflösung teil, wenn std:: decay < F > :: type nicht derselbe Typ wie std:: packaged_task < R ( Args... ) > ist.
Seien
t1
,
t2
, ...,
tN
Werte der entsprechenden Typen in
|
(bis C++20) |
|
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn std:: remove_cvref_t < F > nicht derselbe Typ wie std:: packaged_task < R ( Args... ) > ist. Wenn std:: is_invocable_r_v < R, std:: decay_t < F > & , Args... > false ist, ist das Programm fehlerhaft. |
(seit C++20) |
std::packaged_task
ist nur verschiebbar.
std::packaged_task
mit dem gemeinsam genutzten Zustand und der Aufgabe, die zuvor im Besitz von
rhs
waren, und lässt
rhs
ohne gemeinsam genutzten Zustand und mit einer verschobenen Aufgabe zurück.
Inhaltsverzeichnis |
Parameter
| f | - | das aufrufbare Ziel zur Ausführung |
| a | - | der bei der Speicherung der Aufgabe zu verwendende Allokator |
| rhs | - |
der
std::packaged_task
, von dem verschoben werden soll
|
Exceptions
allocate
-Funktion des Allokators ausgelöst werden, falls die Speicherzuweisung fehlschlägt.
Beispiel
#include <future> #include <iostream> #include <thread> int fib(int n) { if (n < 3) return 1; else return fib(n - 1) + fib(n - 2); } int main() { std::packaged_task<int(int)> fib_task(&fib); std::cout << "Starting task\n"; auto result = fib_task.get_future(); std::thread t(std::move(fib_task), 42); std::cout << "Waiting for task to finish..." << std::endl; std::cout << result.get() << '\n'; std::cout << "Task complete\n"; t.join(); }
Ausgabe:
Starting task Waiting for task to finish... 267914296 Task complete
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Veröffentlichtes Verhalten | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2067 | C++11 |
Der Parametertyp des Kopierkonstruktors war
packaged_task&
|
const hinzugefügt |
| LWG 2097 | C++11 |
Für Überladungen
(2,3)
konnte
F
std::packaged_task<R(Args...)>
sein
|
F
ist eingeschränkt
|
| LWG 4154 | C++11 | Überladungen (2,3) berücksichtigten kein Decaying | Decaying berücksichtigt |