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?

questionAnswers(2)

yourAnswerToTheQuestion