std::function<R(Args...)>::operator=
От ru.cppreference.net
function& operator=( const function& other );
|
(1) | (начиная с C++11) |
function& operator=( function&& other );
|
(2) | (начиная с C++11) |
function& operator=( std::nullptr_t ) noexcept;
|
(3) | (начиная с C++11) |
template< class F >
function& operator=( F&& f );
|
(4) | (начиная с C++11) |
template< class F >
function& operator=( std::reference_wrapper<F> f ) noexcept;
|
(5) | (начиная с C++11) |
Присваивает новую цель объекту std::function.
1) Присваивает копию цели объекта
other, как при выполнении function(other).swap(*this);2) Перемещает цель объекта
other в *this. other находится в корректном состоянии с неопределённым значением.3) Сбрасывает текущую цель.
*this является пустым после вызова.4) Устанавливает цель объекта
*this в вызываемый объект f, как при выполнении function(std::forward<F>(f)).swap(*this);. Этот оператор не участвует в разрешении перегрузки, если только f не является Callable для типов аргументов Args... и возвращаемого типа R.5) Устанавливает цель объекта
*this в копию f, как при выполнении function(f).swap(*this);Параметры
| other | - |
другой
std::function
объект для копирования цели
|
| f | - | вызываемый объект для инициализации target |
| Требования к типам | ||
-
F
должен удовлетворять требованиям
Callable
.
|
||
Возвращаемое значение
* this
Примечания
Еще до того, как поддержка аллокаторов была удалена из
std::function
в C++17, эти операторы присваивания используют аллокатор по умолчанию, а не аллокатор
*
this
или аллокатор
other
(см.
LWG issue 2386
).
Пример
Запустить этот код
#include <cassert> #include <functional> #include <utility> int inc(int n) { return n + 1; } int main() { std::function<int(int)> f1; std::function<int(int)> f2(inc); assert(f1 == nullptr and f2 != nullptr); f1 = f2; // перегрузка (1) assert(f1 != nullptr and f1(1) == 2); f1 = std::move(f2); // перегрузка (2) assert(f1 != nullptr and f1(1) == 2); // f2 находится в допустимом, но неопределенном состоянии f1 = nullptr; // перегрузка (3) assert(f1 == nullptr); f1 = inc; // перегрузка (4) assert(f1 != nullptr and f1(1) == 2); f1 = [](int n) { return n + n; }; // перегрузка (4) assert(f1 != nullptr and f1(2) == 4); std::reference_wrapper<int(int)> ref1 = std::ref(inc); f1 = ref1; // перегрузка (5) assert(f1 != nullptr and f1(1) == 2); }
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2132 | C++11 | the overload ( 4 ) taking a Callable object might be ambiguous | constrained |
| LWG 2401 | C++11 |
assignment operator
(
3
)
from
std::nullptr_t
not required to be noexcept
|
required |
Смотрите также
|
заменяет или уничтожает целевой объект
(публичная функция-член
std::move_only_function
)
|
|
|
(удалена в C++17)
|
присваивает новый целевой объект
(публичная функция-член) |