2012-08-09 8 views

Antwort

7

Es ist schlecht geschrieben, wie es ist, Ihre Verwirrung ist gerechtfertigt. Mit "gültig" meinen sie "hat ein Ziel".

A std::function „hat ein Ziel“, wenn es eine Funktion zugewiesen worden ist:

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 

Sie haben sollte entweder definiert „gültig“, bevor sie verwendet sie, oder einfach mit dem offiziellen Wortlaut stecken.

+0

OK, so die Überprüfung auf Gültigkeit ist nur die Typüberprüfung und das Aufrufen einer default konstruierten 'std :: function' ist genau der Fall, wo' std :: bad_function_call' ausgelöst wird, yup? – dpj

+0

@ user710408: Ich weiß nicht, was Sie meinen, "die Prüfung auf Gültigkeit ist nur die Typüberprüfung". Die Gültigkeit (die Annahme der Definition "hat ein Ziel") wird zur Laufzeit festgelegt, die Typüberprüfung findet zur Kompilierzeit statt. Und ein ungültiger Funktionsaufruf tritt auf, wenn die Funktion nicht gültig ist (kein Ziel hat), sei es von der Standardkonstruk- tion oder explizit mit "nullptr". – GManNickG

+0

Ich glaube nicht, dass ich wusste, was ich auch meinte! Danke :) – dpj

1

Der Sprachstandard sagt

explicit operator bool() const noexcept;

Returns: true, wenn * das ein Ziel hat, sonst false.

Das bedeutet, dass die function hat etwas zu nennen. Der standardmäßig konstruierte function funktioniert natürlich nicht.