std::packaged_task<R(Args...)>:: packaged_task
|
packaged_task
(
)
noexcept
;
|
(1) | (начиная с C++11) |
|
template
<
class
F
>
explicit packaged_task ( F && f ) ; |
(2) | (начиная с C++11) |
|
template
<
class
F,
class
Allocator
>
explicit packaged_task ( std:: allocator_arg_t , const Allocator & a, F && f ) ; |
(3) |
(начиная с C++11)
(до C++17) |
|
packaged_task
(
const
packaged_task
&
)
=
delete
;
|
(4) | (начиная с C++11) |
|
packaged_task
(
packaged_task
&&
rhs
)
noexcept
;
|
(5) | (начиная с C++11) |
Создает новый объект
std::packaged_task
.
std::packaged_task
без задачи и без разделяемого состояния.
std::packaged_task
с сохраненной задачей типа
std::
decay
<
F
>
::
type
и общим состоянием. Сохраненная задача инициализируется с помощью
std::
forward
<
F
>
(
f
)
.
|
Эти перегрузки участвуют в разрешении перегрузки только если std:: decay < F > :: type не является тем же типом, что и std:: packaged_task < R ( Args... ) > .
Пусть
t1
,
t2
, ...,
tN
будут значениями соответствующих типов в
|
(до C++20) |
|
Эта перегрузка участвует в разрешении перегрузки только если std:: remove_cvref_t < F > не является тем же типом, что и std:: packaged_task < R ( Args... ) > . Если std:: is_invocable_r_v < R, std:: decay_t < F > & , Args... > равно false , программа является некорректной. |
(начиная с C++20) |
std::packaged_task
является перемещаемым объектом.
std::packaged_task
с состоянием разделения и задачей, ранее принадлежавшими
rhs
, оставляя
rhs
без состояния разделения и с перемещенной задачей.
Содержание |
Параметры
| f | - | вызываемая цель для выполнения |
| a | - | аллокатор для использования при хранении задачи |
| rhs | - |
объект
std::packaged_task
для перемещения
|
Исключения
allocate
при неудачном выделении памяти.
Пример
#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(); }
Вывод:
Starting task Waiting for task to finish... 267914296 Task complete
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 2067 | C++11 |
тип параметра конструктора копирования был
packaged_task&
|
добавлен const |
| LWG 2097 | C++11 |
для перегрузок
(2,3)
,
F
мог быть
std::packaged_task<R(Args...)>
|
F
ограничен
|
| LWG 4154 | C++11 | перегрузки (2,3) не учитывали затухание | учитывать затухание |