2017-02-06 3 views
2

I mit Standardwert als Parameter eine Methode mit einem Funktionsobjekt haben wollen aufgerufen werden, mit einer Lambda-Funktion aufgerufen werden, wie zum Beispiel:Standardfunktion Objektwert als Funktionsparameter mit einem Lambda-

#include <iostream> 
#include <functional> 

void func(const std::function<void()>& f = {}){ 
    if(f) f(); 
    else std::cout << "or not" << std::endl; 
} 

int main() { 
    func([](){ std::cout << "hello" << std::endl; }); 
    func(); 
} 

, aber in Visual Studio 2012 wird das nicht kompiliert (es kompiliert z. B. mit Visual Studio 2015 oder g ++) und beschwert sich über den Standardwert {}. Ändern Sie dies zu:

void func(const std::function<void()>& f = nullptr){ 

beheben Sie das Problem. 1) Wird diese Funktion vom Compiler nicht unterstützt? 2) Gibt es einen Unterschied zwischen beiden?

+0

Es funktioniert auf VS2015. Für einige Definition von Werken. Es kompiliert. – doctorlove

+1

Was bedeutet es, eine Standardfunktion zu haben? – NathanOliver

+0

1) Es kompiliert mit 'C++ 14' ([link] (http://ideone.com/TiTiP9)). 2) Wenn du ein * empty * labda willst, kannst du schreiben: 'f = []() {}' - nicht nur 'f = {}', aber dann kommst du immer in 'if'. –

Antwort

1

1) Wird diese Funktion vom Compiler nicht unterstützt?

Ihr Test scheint zu zeigen, dass dies der Fall ist. Es ist eine Standardfunktion, also bedeutet es nicht, dass der Compiler nicht dem Standard entspricht.

2) Gibt es einen Unterschied zwischen beiden?

Es gibt keinen Unterschied. Sowohl der Standardkonstruktor als auch der Konstruktor, der nullptr_t übernimmt, verhalten sich genau gleich.