Semplifica l'implementazione, come afferma Andy Prowl. Questo forse risponde "Perché", ma non dice come lo fa.
Una funzione con solo un valore di ritorno, e in particolare uno senza variabili locali, è una situazione speciale per un compilatore. Questa funzione è ora composta da una singola espressione: l'AST della funzione ha bisogno solo di avere una singola radice. Questa mancanza di variabili significa che questa espressione può essere valutata senza una macchina virtuale in piena regola per elaborarla, piuttosto può essere usato un semplice analizzatore di espressioni dell'albero. Per varie ragioni, il compilatore probabilmente dispone già di un simile valutatore o potrebbe crearne uno relativamente facilmente (diventa un passaggio per la semplificazione degli alberi).
Sapere che solo l'espressione constexpr
viene utilizzata all'interno dell'espressione fornisce una semplificazione chiave. Questo garantisce che ogni vertice nella funzione AST abbia le stesse proprietà, anche se è una chiamata di funzione. L'intero meccanismo constexpr
è quindi una forma generalizzata di const-folding. E sebbene non sia sempre fatto a questo alto livello nel compilatore, assicura che possa essere implementato senza uno sforzo enorme (rispetto a una VM completa).
Torna alla domanda "perché". La restrizione è determinata principalmente dalle limitazioni delle risorse sui fornitori. Questa funzionalità, come specificato, non è un grande sforzo e quindi i produttori possono effettivamente implementarlo in un ragionevole periodo di tempo. Se non c'erano tali restrizioni, in particolare consentendo le variabili locali, aumenta notevolmente la quantità di lavoro necessario. Dal punto di vista dell'utente (noi, i programmatori), le restrizioni sono comunque del tutto arbitrarie.
fonte
2013-06-09 03:57:46
Sospetto che sia solo un modo per semplificare le implementazioni del compilatore. – juanchopanza
Perché lo standard dice così. Consentire funzioni più generali complicherebbe parecchio la vita degli scrittori di compilatori (in ogni caso, C++ 14 solleva alcune di queste restrizioni) –
Perché consentire le variabili significherebbe aggiungere molte altre (più complicate) restrizioni. Così hanno mantenuto semplice la loro introduzione. Ci sono comunque dei modi per aggirare (chiamare una funzione 'constexpr' da un'altra, ad esempio) – Dave