Oznaczenie funkcji jako constexpr
ró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).
inline
z 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 constexpr
funkcje 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) constexpr
po 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.
constexpr
Funkcja 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ć
try
bloku.
- 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 goto
lub asm
oś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ł.