2016-06-05 9 views
5

std::function ermöglicht es Ihnen, dies zu tun:Warum funktioniert die Konstruktion nicht von verschiedenen Rückgabetypen?

std::function<void()> = []()->int{return 42;}; 

Aber nicht dieses:

std::function<void()> = [](int i)->int{return 42;}; 

Vermutlich weil der Rückgabetyp nicht Teil einer Funktion Unterschrift ist. Aber std::function ist ein Klassentyp, der einen Rückgabetyp erhält und den Rückgabetyp des Funktionsobjekts kennt, aus dem er konstruiert ist. Es besteht also die Möglichkeit eines Compilerfehlers.

Warum gibt es keinen Compilerfehler?

+1

Auch Ihr Code hat ein undefiniertes Verhalten. –

+0

@sleeptightpupper: Es ist kein Duplikat der ersten, da die erste über Parameter, nicht unterschiedliche Rückgabetypen ist. –

+0

@ NicolBolas Es ist definitiv ein [Duplikat] (http://Stackoverflow.com/a/9341064). Kurz gesagt ist "int" nicht implizit in "void" umwandelbar, so dass wir ein undefiniertes Verhalten erhalten. – user6412786

Antwort

4

Es gab eine bug in the C++11 standard, die alle std::function<void(???)> vollständig unbrauchbar machte. Einige Compiler interpretierten den Fehler so, dass der Rückgabetyp von allem, was in einem solchen std::function gespeichert ist, ignoriert werden sollte, andere, die nur void mit einem solchen std::function kompatibel waren.

In der defect resolution (via @ t.c) wurde behoben, dass eine std::function<void(???)> den Rückgabetyp (und Wert) des gespeicherten Objekts ignoriert.

Ihr Compiler verwendet diese Interpretation, die die aktuelle ist.

Unabhängig davon müssen die Argumente aus den Argumenten der std::function konvertiert werden.

Kurz gesagt, weil der Standard (überarbeitet) so sagt.

In der Praxis ist es sinnvoll, Rückgabewerte verwerfen zu können. Währenddessen können Sie eine Funktion oder ein Callable Object ohne Daten nicht aufrufen, um es aufzurufen. Es wurde entschieden, dass die unvollständige Übereinstimmung in Ordnung ist (wenn also die Argumente/Rückgabewerte konvertiert werden, ist std::function Spiel). Und da hast du es.

Verwandte Themen