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?
Istnieje [propozycja] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3610.html) na coś takiego. –
@JohnSchug oh, ale to jest datowane 2013-03-15! Tak więc odpowiedź brzmi "oboje"? (ponieważ wydaje się, że jest to wcześniejsza propozycja?) –
(Nie wspomina się również o implementacji GCC, więc może być rozwijany całkowicie niezależnie od tego.) –