2016-05-19 10 views
18

Ich habe über folgende Lambda-Syntax gestolpert, die ich nicht verstehe:Was bedeutet <: and :> bei der Deklaration eines Lambda?

#include <iostream> 

template<typename Callback> 
void do_it(Callback callback) { 
     callback(); 
} 

template<typename T> 
void p() { 
     std::cout << __PRETTY_FUNCTION__ << std::endl; 
} 

int main() { 
     auto a = <:&:> { }; 
     p<decltype(a)>(); 
     do_it(<:&:> { std::cout << "Hello" << std::endl; }); //this 
} 

Programm erzeugt über einen Ausgang:

void p() [with T = main()::__lambda0] 
Hello 

Können Sie uns erklären, was bedeutet <:&:> {/* ... */}? Ist es möglich, auf diese Weise ein Lambda zu deklarieren, das ein Argument annimmt?

+0

https://stackoverflow.com/questions/15736282/what-is-this-smiley-with-beard-expression – Yakk

Antwort

42

<: und :> sind digraphs. Sie werden in [ bzw. ] übersetzt. So entspricht Ihr Code:

auto a = [&] { }; 
do_it([&] { std::cout << "Hello" << std::endl; }); 

So ist es nur ein Lambda, das alles durch Bezugnahme erfasst.

ein Lambda zu deklarieren, die wie folgt ein Argument nimmt, fügen Sie einfach eine Parameterliste nach der Capture-Gruppe:

auto a = <:&:> (AType) { }; 

Wenn Sie möchten, wer Ihren Code liest, dich zu hassen, können Sie ein verwenden Mischung aus Digraphe und trigraphs wo immer möglich:

auto a = <:&??)??<%>; 
//  ^same as [&]{} 
+2

es Sinn macht. Es war wirklich irreführend, weil ich nicht verstehe, wer und warum heutzutage Digraphen verwenden würde. – aadam

+1

@aadam Ja, wo bist du auf diesen Code gestoßen? – TartanLlama

+2

@aadam: Ich bin sicher, dass Sie diesen Code selbst kommen, möglicherweise, weil Sie aufgeregt sind, dies mit anderen zu teilen: P – Nawaz