2012-08-09 14 views

risposta

7

È mal scritto così com'è, la tua confusione è giustificata. Con "valido" significano "ha un obiettivo".

A std::function "ha un obiettivo" quando è stata assegnata una funzione:

std::function<void()> x; // no target 
std::function<void()> y = some_void_function; // has target 

x = some_other_void_function; // has target 
y = nullptr; // no target 

x = y; // no target 

dovrebbero avere sia definito "valido", prima hanno usato, o semplicemente bloccato con la dicitura ufficiale.

+0

OK, quindi il controllo di validità è solo il controllo del tipo e chiamare un predefinito costruito 'std :: funzione' è esattamente il caso in cui' std :: bad_function_call' è sollevato, sì? – dpj

+0

@ user710408: Non so cosa intendi per "il controllo di validità è solo il controllo del tipo". La validità (ora assumendo la definizione "ha un obiettivo") è determinata in fase di esecuzione, il controllo dei tipi avviene in fase di compilazione. E la chiamata a una funzione errata si verifica quando la funzione non è valida (non ha una destinazione), sia quella di default o assegnata esplicitamente a 'nullptr'. – GManNickG

+0

Non penso di sapere cosa volevo dire! Grazie :) – dpj

1

Il linguaggio standard dice

explicit operator bool() const noexcept;

Restituisce: vero se * questo ha un obiettivo, altrimenti false.

Significa che lo function ha qualcosa da chiamare. Ovviamente il default costruito function no.

Problemi correlati