Wyrażenia nie są wyrażeń stałych, jeśli zawierają jedną z wielu niedozwolonych podwyrażeń. Jedną z klas niedozwolonych pod wyrażeń jest:
- lwartością do RValue konwersji (4.1), o ile jest on stosowany do
- w glvalue integralnego lub wyliczania typu, który odnosi się do niearomatycznego -wolny obiekt const z poprzednią inicjalizacją , zainicjalizowany stałą ekspresją lub glownością typu literalnego, która odnosi się do nieulotnego obiektu zdefiniowanego przez
constexpr
, lub który odnosi się do pod-obiektu takiego obiektu lub
- glwartość typu literalnego, która odnosi się do nieulotnego obiektu tymczasowego, którego żywotność nie została zakończona, zainicjalizowana za pomocą stałego wyrażenia;
W szczególności, podczas gdy nazwa const przedmiotu wyliczenia lub Zintegrowanego typu inicjowane przy stałym inicjator stanowi stałej ekspresji (odczytaniem wartości, co powoduje lwartość-to-RValue konwersja), sub-obiekty obiektu zagregowanego const (takie jak list
w twoim przykładzie, tablica) nie, ale będą, jeśli zostaną zadeklarowane constexpr
.
const int list[3] = { 2, 5, 7 };
const int a = list[2];
Jest to ważne, ale a
nie stanowi stałą ekspresję ponieważ nie jest inicjowany z stałej ekspresji.
Zmieniając deklarację list
(nie musimy zmieniać deklaracji a
), możemy uczynić a
formą stałego wyrażenia.
constexpr int list[3] = { 2, 5, 7 };
const int a = list[2];
jako list[2]
jest teraz stałej ekspresji, a
jest teraz const
Przedmiotem Zintegrowanego typu inicjowane z stałej ekspresji tak a
może być obecnie używany jako stały ekspresji.
Pomyślałem, że constexpr będzie pomocny, a teraz, gdy patrzę, widzę, że ma szersze zastosowanie, niż myślałem. W związku z tym, nieco więcej wyjaśnienia, dlaczego deklaracja const int a works, ale lista [1] w szczególności nie byłoby docenione. Dziękuję Ci. –
OK, więc visual studio 2012 nie planuje obsługiwać constexpr. Czy ktoś ma jakieś inne rozwiązania? NIE MAM tego używać, ale byłoby miło. –
@ std''OrgnlDave Dodałem więcej diagnostyki kompilatora, która wyjaśnia, dlaczego lista [1] nie jest wyrażeniem stałym. – bames53