Es vereinfacht die Implementierung, wie Andy Prowl sagt. Das beantwortet möglicherweise "Warum", aber es sagt nicht, wie es das macht.
Eine Funktion mit nur einem Rückgabewert und speziell ohne lokale Variablen ist eine spezielle Situation für einen Compiler. Diese Funktion besteht nun aus einem einzigen Ausdruck: Der AST der Funktion muss nur eine einzige Wurzel haben. Dieser Mangel an Variablen bedeutet, dass dieser Ausdruck ohne eine vollständige virtuelle Maschine ausgewertet werden kann, um sie zu verarbeiten, stattdessen kann ein einfacher Baumausdruck-Evaluator verwendet werden. Aus verschiedenen Gründen hat der Compiler wahrscheinlich bereits einen solchen Evaluator oder könnte einen relativ leicht erstellen (es wird ein Tree-Simplification-Pass).
Zu wissen, dass innerhalb des Ausdrucks nur constexpr
verwendet wird, bietet auch eine wichtige Vereinfachung. Dies garantiert, dass jeder Knoten in der Funktion AST die gleichen Eigenschaften hat, selbst wenn es sich um einen Funktionsaufruf handelt. Der gesamte constexpr
Mechanismus ist dann eine verallgemeinerte Form der Const-Faltung. Und obwohl es im Compiler nicht immer auf dieser hohen Ebene gemacht wird, stellt es sicher, dass es ohne großen Aufwand (im Vergleich zu einer vollständigen VM) implementiert werden kann.
Zurück zur Frage "Warum". Die Beschränkung wird hauptsächlich durch Ressourcenbeschränkungen bei den Anbietern verursacht. Dieses Merkmal ist, wie angegeben, kein großer Aufwand, und daher können die Anbieter es in einer angemessenen Zeitspanne tatsächlich implementieren. Wenn es keine solchen Einschränkungen gäbe, insbesondere wenn lokale Variablen zugelassen würden, würde dies den Arbeitsaufwand erheblich erhöhen. Aus Sicht des Anwenders (uns, den Programmierern) sind die Einschränkungen jedoch völlig willkürlich.
Ich vermute, es ist nur ein Mittel, um es für Compiler-Implementierungen einfach zu halten. – juanchopanza
Weil der Standard dies sagt. Die Berücksichtigung allgemeinerer Funktionen würde die Lebensdauer von Compiler-Schreibern erheblich verkomplizieren (C++ 14 hebt jedoch einige dieser Einschränkungen auf) –
Da das Zulassen von Variablen bedeuten würde, dass viele andere (kompliziertere) Einschränkungen hinzugefügt werden müssten. Also haben sie es einfach gehalten für ihre Einführung. Es gibt sowieso Möglichkeiten, die Funktion "constexpr" beispielsweise von einer anderen zu nennen. – Dave