W C++, błąd nie jest wezwanie do arraySize(y)
, ale deklaracja samego y
.
Ograniczenia w deklaracji tablicowej muszą być "przekształconym wyrażeniem stałym".
Jeśli Twój kompilator akceptuje deklarację y
, a później mówi, że y
jest tablicą powiązanego środowiska wykonawczego, to nie jest kompilatorem C++. W żadnej ratyfikowanej wersji C++ nie ma tablic wykonawczych, ani aktualnej wersji roboczej.
Istotna różnica między arraySize(s.c)
i arraySize(ps->c)
jest ps->c
jest taka sama jak (*ps).c
i operator *
nieprawidłowego wymaga lwartości do RValue konwersję ps
, który nie jest stały wyrażenie (ani &s
patrz poniżej). Reszta wyrażenia nie obejmuje konwersji l-do-wartości, tablica-wartość jest bezpośrednio związana przez odniesienie.
Stała ekspresja jest albo rdzeń glvalue stała ekspresja którego wartość odnosi się do jednostki, która jest dopuszczalna wynikiem stałej ekspresji (jak zdefiniowane poniżej) albo prvalue rdzeń stałej ekspresji, którego wartość jest obiekt, gdzie dla tego obiektu i jego podobiektów:
każdy niż statyczna składowa danych typu odniesienia dotyczy jednostki, która jest dopuszczalna wynikiem stałej ekspresji i
i f obiekt lub podobiekt jest typu wskaźnikowego, zawiera adres obiektu o statycznym czasie przechowywania, adres znajdujący się za końcem takiego obiektu (5.7), adres funkcji lub wartość wskaźnika zerowego.
Podmiot jest dozwolone wynikiem stałej ekspresji, jeśli celem statycznych okres przechowywania, który jest albo nie jest tymczasowe przedmiot lub stanowi tymczasowy obiekt, którego wartość satis fi ES powyższe ograniczenia, lub jest Funkcja.
Wyraźnie ps
zawiera adres obiektu z automatycznym okres przechowywania, więc nie może być uznana za constexpr
. Ale wszystko powinno zacząć działać, jeśli zmienisz S s; S* ps = &s;
do static S s; constexpr S* ps = &s;
(Z drugiej strony, można by pomyśleć, że parametr do arraySize(s.c)
nie jest stałą albo wyrażenie, gdyż jest punktem odniesienia, a nie przedmiot pamięci statycznej czas trwania)
Jaki jest błąd? –
Cóż, jestem zakłopotany ... zarówno 'sc' jak i' ps-> c' mają ten sam typ, jak wypisane przez 'typeid (sc) .name()' lub 'typeid (ps-> c) .name() ', ie'A10_c' dla g ++ – vsoftco
Aby przyciemnić nieco więcej: jeśli ustawisz parametr' arraySize() na wartość referencyjną na const, poniższe kompiluje: 'char y [arraySize (decltype (ps-> c) {})]; ' – Quentin