2016-05-19 12 views
18

mam natknął następującą składnią lambda, których nie rozumiem:Co oznacza <: and :> przy deklaracji 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 
} 

Program powyżej wytwarza moc:

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

mógłbyś wyjaśnić, co robi <:&:> {/* ... */} oznacza? Czy możliwe jest zadeklarowanie w ten sposób lambda, która przyjmuje argument?

+0

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

Odpowiedz

42

<: i :>digraphs. Zostaną one przetłumaczone odpowiednio na [ i ]. Jako taki, twój kod jest równoważny z:

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

To tylko lambda, która przechwytuje wszystko przez odniesienie.

Aby zadeklarować lambda, która przyjmuje argument tak, wystarczy dodać do listy parametrów po grupy przechwytywania:

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

Jeśli chcesz ktokolwiek czyta kod cię nienawidzić, można użyć mieszanka digrafach i trójznaków miarę możliwości:

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

To ma sens. To było naprawdę mylące, ponieważ nie rozumiem, kto i dlaczego używał digrafów w dzisiejszych czasach. – aadam

+1

@aadam Tak, gdzie znalazłeś ten kod? – TartanLlama

+2

@aadam: Jestem pewien, że sam wymyśliłeś ten kod, być może dlatego, że jesteś podekscytowany, aby podzielić się tym z innymi: P – Nawaz