2013-04-02 9 views
13

dziwo, GCC 4.7.2 wydaje się nie mieć problemu z następującego kodu:Nieudokumentowane rozszerzenie GCC C++ 11? Przechwytywanie dowolnych wyrażeń lambda w wychwytywaniu wymienia

template<typename T> 
T&& identity(T&& x1) { 
    return std::forward<T>(x1); 
} 

int main(int, char**) { 
    int x1 = 1; 
    int &x2 = identity(x1); 
    auto f = [&x1]() mutable { 
     x1 = x1 + 1; 
    }; 
    auto g1 = [y=x2+1]() { 
     static_assert(std::is_same<decltype(y), const int>::value, "fail"); 
     std::cout << "g1: " << y << std::endl; 
    }; 
    auto h1 = [y=identity(x1)+1]() { 
     static_assert(std::is_same<decltype(y), const int>::value, "fail"); 
     std::cout << "h1: " << y << std::endl; 
    }; 
    auto g2 = [&y=x2]() { 
     static_assert(std::is_same<decltype(y), int&>::value, "fail"); 
     std::cout << "g2: " << y << std::endl; 
    }; 
    auto h2 = [&y=identity(x1)]() { 
     static_assert(std::is_same<decltype(y), int&>::value, "fail"); 
     std::cout << "h2: " << y << std::endl; 
    }; 
    f(); g1(); h1(); g2(); h2(); 
    f(); g1(); h1(); g2(); h2(); 
    return 0; 
} 

Wyniki są następujące:

g1: 2 
h1: 2 
g2: 2 
h2: 2 
g1: 2 
h1: 2 
g2: 3 
h2: 3 

nie mogę wydaje się znajdować wzmiankę o przechwytywaniu dowolnych wyrażeń na listach przechwytywania lambda, nawet w n3285 (z dnia 2012-10-02). Ponadto, nie mogę znaleźć żadnej dokumentacji tego jako oficjalnego rozszerzenia GCC w dowolnym miejscu.

Czy to nieudokumentowana przedłużenie GCC (a la VLAs as structure members, proponowana/nadchodzące C++ dysponują że GCC upadł do przodu i wdrożony na początku, ani, oba, czy co?

+1

Istnieje [propozycja] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3610.html) na coś takiego. –

+0

@JohnSchug oh, ale to jest datowane 2013-03-15! Tak więc odpowiedź brzmi "oboje"? (ponieważ wydaje się, że jest to wcześniejsza propozycja?) –

+0

(Nie wspomina się również o implementacji GCC, więc może być rozwijany całkowicie niezależnie od tego.) –

Odpowiedz

5

Jak zauważył w komentarzach, funkcja jest zasadniczo podobny do niedawnego wniosku, ale został wprowadzony na długo przed początkową standaryzacją, GCC służył jako prototyp podczas standardowego opracowywania i początkowo odzwierciedlał wszelkie pomysły, które autorzy lubili, a które później zostały dopracowane.Niektóre pomysły musiały zostać przycięte, aby zachować rozsądnie standard proste są ponownie wprowadzane jako propozycje, Lambdas ma dużo miejsca do wzrostu,

Na razie to tylko kolejny bu sol. To nigdy nie zostało usunięte z pierwotnej implementacji, ponieważ nikt jeszcze tego nie zgłosił.


Aktualizacja: To jest teraz standardową funkcją C++ od 14.