const std::function<void()>& f = std::function<void()>()
Ответ 3
Я использовал бы nullptr для пустого случая. Его можно использовать, потому что вы никогда не используете полнофункциональные объекты, а только указатели на них, поэтому func(f1); будет на самом деле func(&f1) = > вы всегда будете передавать указатели на func, поэтому nullptr является IMHO лучшим кандидатом.
Это компилируется и запускается:
void func(const std::function<void()>& f = nullptr)
{
if(f)
f();
}
Альтернативой использования функции по умолчанию будет:
с использованием исключения catch. Выбор между 2 главным образом зависит от того, ожидаете ли вы, что будет пустой случай; почти никогда: используйте исключение и иногда: тест перед вызовом.
В качестве вопроса упоминается if (f), используйте nullptr
Ответ 4
Вы можете попробовать следующее:
const std::function<void()> & f = std::function<void()>()
По мере добавления Базиля в стандарте говорится:
§ 20.8.11.1 Класс bad_function_call [func.wrap.badcall]
1/Исключение типа bad_function_call выбрасывается function:: operator() (20.8.11.2.4), когда объект-оболочка функции не имеет цели.