2012-11-29 12 views
9

Dies funktioniert ...Verwenden decltype und std :: Funktion mit Lambda

auto x = 4; 
typedef decltype(x) x_t; 
x_t y = 5; 

... so funktioniert, warum nicht?

int j = 4; 
auto func = [&] (int i) { cout << "Hello: i=" << i << " j=" << j << endl;}; 
typedef decltype(func) lambda_t; 
lambda_t func2 = [&] (int i) { cout << "Bye: i=" << i << " j=" << j << endl;}; 

... und wie würde ich lambda_t manuell mit std :: Funktion deklarieren?

Antwort

14

... also warum funktioniert das nicht?

Da jede lexikalische Instanz eines Lambda einen anderen Typ hat. Es spielt keine Rolle, ob dieselben Zeichen verwendet werden.

.. und wie würde ich lambda_t manuell mit std :: function deklarieren?

Das Lambda nimmt ein int Argument und gibt nichts zurück ... Deshalb:

typedef std::function<void(int)> lambda_t; 
7

Lambda-Typen sind unutterable (nicht benannt werden kann), was der Grund dafür ist, dass Sie nicht, was tun Sie Fragen. Abgesehen davon, ist jedes Lambda von einem anderen Typ, und selbst wenn Sie den Typ benennen könnten, wäre es nicht möglich, das zweite Lambda dem ersten zuzuordnen. Wenn Sie sich die Lambda-Syntax als Abkürzung für ein Funktionsobjekt vorstellen, wird das deutlicher: Das Element operator() ist für jedes Lambda unterschiedlich und somit von unterschiedlicher Art.

Sie können andererseits ein Lambda einem std::function<> Objekt der entsprechenden Signatur zuordnen, was in Ihrem Fall std::function<void(int)> wäre.

+0

Sie können sicher deflambdas mit declltype so tippen. –

+1

@R.MartinhoFernandes wirft die Frage auf, warum 'declltype (func)' nicht 'std :: function ' anstelle von etwas unbrauchbarem Müll zurückgibt? – learnvst

+1

@learnvst: Warum sollte es? 'declltype' gibt den deklarierten Typ zurück, und ein Lambda ist * nicht * eine' std :: function'. Außerdem hat "std :: function" unter anderem dank der Art des Löschens Leistungseinbußen. – Xeo

0

Hier ist ein solider Beweis, dass dies nicht funktioniert. Ähnliches Szenario:

int foo = 3; 
int bar = 3; 

std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints one -- obviously - they are the same type 

Jetzt können wir den exakt gleichen Code verwenden, aber mit Lambdas. Was denkst du wird die Antwort sein?

auto foo = [](){std::cout << "HELLO\n"; }; 

    auto bar = [](){std::cout << "HELLO\n"; }; 

    std::cout << (typeid(foo).hash_code() == typeid(bar).hash_code()); // prints 0 -- different type even though they are declared exactly the same. 
Verwandte Themen