Ein Funktionszeiger vom Typ bool (*)()
kann in std::function<bool()>
konvertiert werden, ist aber nicht vom selben Typ, daher ist eine Konvertierung erforderlich. Bevor der Compiler prüfen kann, ob diese Konvertierung möglich ist, muss er ReturnT
als bool
ableiten, aber dazu muss er bereits wissen, dass std::function<bool()>
eine mögliche Konvertierung ist, die nicht möglich ist, bis es ReturnT
... ergibt ... sehen Sie das Problem?
Bedenken Sie auch, dass bool(*)()
auch in std::function<void()>
oder std::function<int()>
konvertiert werden könnte ... was sollte abgeleitet werden?
diese Vereinfachung vor:
template<typename T>
struct function
{
template<typename U>
function(U) { }
};
template<typename T>
void foo(function<T>)
{ }
int main()
{
foo(1);
}
Wie kann der Compiler wissen, ob Sie function<int>
oder function<char>
oder function<void>
schaffen wollte, wenn sie alle int
eine Form aufgebaut werden kann?
Eine Antwort auf [eine meiner vorherigen Fragen] (http://stackoverflow.com/questions/9625526/check-at-compile-time-if-template-argument-is-void) ermöglicht diese Art von Syntax. Ich hoffe das hilft. Es ist spezialisiert, wenn der Rückgabetyp auch ungültig ist. – chris
@chris Danke für den Hinweis - ich werde versuchen, es zu verstehen :) –
N.B. sehr ähnlich zu http://Stackoverflow.com/q/7608741/981959 und http://Stackoverflow.com/q/9242234/981959, aber ich denke, dass die Antworten hier für diese spezifische Frage klarer sind. –