¿Por qué las instancias std :: function tienen un constructor predeterminado?

Esta es probablemente una pregunta filosófica, pero me encontré con el siguiente problema:

Si define una función std ::, y no la inicializa correctamente, su aplicación se bloqueará, como esta:

typedef std::function<void(void)> MyFunctionType;
MyFunctionType myFunction;
myFunction();

Si la función se pasa como argumento, así:

void DoSomething (MyFunctionType myFunction)
   {
   myFunction();
   }

Entonces, por supuesto, también se bloquea. Esto significa que me veo obligado a agregar un código de verificación como este:

void DoSomething (MyFunctionType myFunction)
   {
   if (!myFunction) return;
   myFunction();
   }

Requirir estas comprobaciones me devuelve un recuerdo de los viejos días C, donde también tenía que verificar todos los argumentos de puntero explícitamente:

void DoSomething (Car *car, Person *person)
   {
   if (!car) return;      // In real applications, this would be an assert of course
   if (!person) return;   // In real applications, this would be an assert of course
   ...
   }

fortunadamente, podemos usar referencias en C ++, lo que me impide escribir estas comprobaciones (suponiendo que la persona que llama no pasó el contenido de un nullptr a la función:

void DoSomething (Car &car, Person &person)
   {
   // I can assume that car and person are valid
   }

Entonces, ¿por qué las instancias std :: function tienen un constructor predeterminado? Sin el constructor predeterminado, no tendría que agregar controles, al igual que para otros argumentos normales de una función. Y en esos casos 'raros' en los que desea pasar una función std :: 'opcional', aún puede pasarle un puntero (o usar boost :: opcional).

Respuestas a la pregunta(7)

Su respuesta a la pregunta