Krótka odpowiedź jest taka, że nie tylko jest staticprzydatna, ale też całkiem dobrze będzie zawsze pożądana.
Po pierwsze, zauważ to statici constexprsą całkowicie od siebie niezależne. staticokreśla czas życia obiektu podczas wykonywania; constexprokreśla, że obiekt powinien być dostępny podczas kompilacji. Kompilacja i wykonanie są rozłączne i niejednoznaczne, zarówno w czasie, jak i przestrzeni. Po skompilowaniu program constexprprzestaje być istotny.
Każda zadeklarowana zmienna constexprjest domyślnie, constale consti staticprawie ortogonalna (z wyjątkiem interakcji z static constliczbami całkowitymi).
Model C++obiektowy (§ 1.9) wymaga, aby wszystkie obiekty inne niż pola bitowe zajmowały co najmniej jeden bajt pamięci i miały adresy; ponadto wszystkie takie obiekty, które w danym momencie można zaobserwować w programie, muszą mieć odrębne adresy (pkt 6). Nie wymaga to od kompilatora utworzenia nowej tablicy na stosie dla każdego wywołania funkcji z lokalną niestatyczną stałą tablicą const, ponieważ kompilator może schronić się w as-ifzasadzie, pod warunkiem, że może udowodnić, że żaden inny taki obiekt nie może być zauważony.
Niestety nie będzie to łatwe do udowodnienia, chyba że funkcja jest trywialna (na przykład nie wywołuje żadnej innej funkcji, której treść nie jest widoczna w jednostce tłumaczenia), ponieważ tablice, mniej więcej z definicji, są adresami. Dlatego w większości przypadków const(expr)tablica niestatyczna będzie musiała zostać odtworzona na stosie przy każdym wywołaniu, co nie pozwala na obliczenie jej w czasie kompilacji.
Z drugiej strony, static constobiekt lokalny jest wspólny dla wszystkich obserwatorów, a ponadto może zostać zainicjowany, nawet jeśli funkcja, w której jest zdefiniowany, nigdy nie zostanie wywołana. Żadne z powyższych postanowień nie ma zastosowania, a kompilator może nie tylko wygenerować tylko jedną jego instancję; wygenerowanie pojedynczego wystąpienia w pamięci tylko do odczytu jest bezpłatne.
Więc zdecydowanie powinieneś użyć static constexprw swoim przykładzie.
Jest jednak jeden przypadek, w którym nie chcesz używać static constexpr. O ile constexprzadeklarowany obiekt nie jest używany ani deklarowany ODRstatic , kompilator może go w ogóle nie uwzględniać. Jest to bardzo przydatne, ponieważ pozwala na użycie tymczasowych constexprtablic w czasie kompilacji bez zanieczyszczania skompilowanego programu niepotrzebnymi bajtami. W takim przypadku najwyraźniej nie chcesz używać static, ponieważ staticprawdopodobnie zmusi obiekt do istnienia w czasie wykonywania.
constzconstobiektu, jedynie zconst X*którego punkty doX. Ale nie o to chodzi; chodzi o to, że obiekty automatyczne nie mogą mieć adresów statycznych. Jak powiedziałem,constexprprzestaje mieć znaczenie po zakończeniu kompilacji, więc nie ma nic do odrzucenia (i całkiem możliwe, że w ogóle, ponieważ nie można zagwarantować, że obiekt istnieje w środowisku wykonawczym.)