Obiekt constexpr przechwytujący Lambda
GCC 4.7.2 kompiluje to:
constexpr int i = 5;
[]{ std::integral_constant< int, i >(); }; // nonstandard: i not captured
ale nie to:
constexpr int i = 5;
[&i]{ std::integral_constant< int, i >(); }; // GCC says i not constexpr
Ten ostatni przykład wydaje mi się poprawny, zgodnie z C ++ 11 §5.1.2 / 15:
Obiekt jest przechwytywany przez odniesienie, jeśli jest niejawnie lub jawnie przechwycony, ale nie przechwycony przez kopię. Nie jest określone, czy dodatkowe nienazwane statyczne elementy danych są deklarowane w typie zamknięcia dla obiektów przechwyconych przez odniesienie.
Wygląda na to, że został schwytanyi
wewnątrz lambda odnosi się do zmiennej w otaczającym zakresie, czyliconstexpr
, nie tylko aconst
odniesienie.
Standard wyraźnie mówi, że użycie przechwytywania wartości dodanej jest przekształcane w użycie odpowiedniego elementu obiektu lambda. I myślę, że 5.1.2 wskazuje, że moja interpretacja jest poprawna.
Czy jest coś, co wyraźnie mówi, że przechwytywanie przez odniesienie odnosi się do obiektu w zakresie obejmującym lub odniesienie?