Oznaczenie funkcji jako constexprrównież czyni ją funkcją wbudowaną § [dcl.constexpr] / 1:
Funkcja lub element danych statycznych zadeklarowany za pomocą specyfikatora constexpr jest domyślnie funkcją wbudowaną lub zmienną (7.1.6).
inlinez kolei oznacza, że musisz zawrzeć definicję tej funkcji w każdej jednostce tłumaczeniowej, w której może być używana. Zasadniczo oznacza to, że constexprfunkcje muszą być:
- ograniczone do użycia w jednej jednostce tłumaczeniowej, lub
- zdefiniowane w nagłówku.
Najbardziej typowe funkcje, które chcesz zadeklarować w nagłówku i zdefiniować w pliku źródłowym (i wszystko, co ich używa, zawiera tylko nagłówek, a następnie łącza do pliku obiektowego tego źródła) constexprpo prostu nie działa.
Teoretycznie przypuszczam, że możesz po prostu przenieść wszystko do nagłówków i mieć tylko jeden plik źródłowy, który zawiera tylko wszystkie nagłówki, ale drastycznie zaszkodzi to czasom kompilacji, a dla większości poważnych projektów kompilacja wymaga ogromnej ilości pamięci.
constexprFunkcja jest również ograniczone w pewnym sensie, tak dla niektórych funkcji nie może być opcja w ogóle. Ograniczenia obejmują:
- funkcje wirtualne nie mogą być
constexpr.
- jego typ zwracany musi być „dosłowny” (np. nie ma obiektów z nietrywialnymi lekarzami lub lekarzami).
- wszystkie jego parametry muszą być literalne.
- ciało funkcji nie może zawierać
trybloku.
- nie może zawierać definicji zmiennej typu nieliteralnego ani niczego o czasie przechowywania statycznym lub wątku.
Pominąłem kilka raczej niejasnych rzeczy (np. Nie może również zawierać instrukcji gotolub asmoświadczenia), ale masz pomysł - w przypadku kilku rzeczy to po prostu nie zadziała.
Podsumowując: tak, jest całkiem sporo sytuacji, w których byłby to zły pomysł.