Upraszcza wdrażanie, jak mówi Andy Prowl. To prawdopodobnie odpowiada "Dlaczego", ale nie mówi, jak to robi.
Funkcja z tylko wartością zwracaną, a dokładniej bez zmiennych lokalnych, jest szczególną sytuacją dla kompilatora. Ta funkcja składa się obecnie z pojedynczego wyrażenia: funkcja AST musi mieć tylko jeden root. Ten brak zmiennych oznacza, że to wyrażenie można ocenić bez pełnowymiarowej maszyny wirtualnej, aby go przetworzyć, można użyć prostego ewaluatora wyrażeń drzewa. Z różnych powodów kompilator prawdopodobnie ma już takiego ewaluatora lub może go stosunkowo łatwo utworzyć (staje się przepustką do uproszczenia drzewa).
Wiedząc, że tylko wyrażenie constexpr
jest używane wewnątrz wyrażenia, zapewnia również podstawowe uproszczenie. Gwarantuje to, że każdy wierzchołek w funkcji AST ma te same właściwości, nawet jeśli jest to wywołanie funkcji. Cały mechanizm constexpr
jest wówczas uogólnioną formą składania składanego. I choć nie zawsze odbywa się to na tak wysokim poziomie w kompilatorze, zapewnia to, że można go wdrożyć bez dużego wysiłku (w porównaniu do pełnej maszyny wirtualnej).
Powrót do pytania "dlaczego". Ograniczeniem są przede wszystkim ograniczenia zasobów u dostawców. Ta funkcja, jak określono, nie jest wielkim wysiłkiem, a zatem dostawcy mogą ją wdrożyć w rozsądnym czasie. Jeśli nie było takich ograniczeń, w szczególności dopuszczając zmienne lokalne, znacznie zwiększa to ilość potrzebnej pracy. Z punktu widzenia użytkownika (nas, programistów) ograniczenia są jednak całkowicie arbitralne.
Podejrzewam, że jest to po prostu sposób na uproszczenie implementacji kompilatora. – juanchopanza
Ponieważ Standard tak mówi. Zezwolenie na bardziej ogólne funkcje znacznie komplikowałoby życie pisarzy kompilatorów (zresztą C++ 14 usuwa niektóre z tych ograniczeń). –
Ponieważ dopuszczanie zmiennych oznaczałoby dodanie wielu innych (bardziej skomplikowanych) ograniczeń. Utrzymywali więc prostotę ich wprowadzenia. Są na to sposoby i tak (na przykład wywołanie funkcji 'constexpr' z innej) – Dave