std::function
может быть пустым, и его можно преобразовать в bool
, чтобы проверить, есть ли у него цель или нет. Но как установить для него значение null после того, как вы ему что-то присвоили?
int main()
{
std::function<void()> f = []() { return 4; };
// how to reset to null, to it's initial state when default constructed.
}
@Irelia По той же причине вы установили указатель на ноль. Иногда там нет никакой функции. Почему там не будет функции? Почему в указателе не может быть действительного адреса? Я не знаю.
@JaMiT Сброс std::function или установка для нее значения «null» концептуально не то же самое, что присвоение ей nullptr. Он может содержать объект отдельно от указателя на вызов функции.
@JaMiT О, хорошо, извини. Я удивлен, что на нем нет функции сброса.
Присвойте ему nullptr
, чтобы он стал пустым.
f = nullptr;
Вы также можете:
присвойте ему nullptr
:
f = nullptr;
присвойте ему пустой function
:
f = std::function<void()>{};
// or:
f = decltype(f){};
swap()
это с другим пустым function
:
std::function<void()>{}.swap(f);
// or:
decltype(f){}.swap(f);
Самый простой способ, я использую его:
f = {};
https://godbolt.org/z/hzEq3xo4e
#include <functional>
int main() {
std::function<void()> f = []() { return 4; };
f = {};
}
Что это за синтаксис? Делая { }, что именно он делает? Вызывает ли он конструктор списка инициализаторов или как?
Он вызывает std::function::operator=(const std::function&)
с пустым временным std::function{}
, то есть присваивает пустой std::function
существующему std::function
, так же, как f = decltype(f){};
, но decltype(f)
не нужен.
Но почему вы хотите установить его равным нулю?