2016-02-10 16 views
9

Dopo aver rilassato le regole per il constexpr, sembra che queste funzioni possano essere utilizzate ovunque. Possono essere chiamati sia su variabili costanti (constexpr) che locali (mutabili). Quindi per me sembra solo un suggerimento per il compilatore (come inline). Continuo a scriverlo ovunque e rimuoverlo se il compilatore si lamenta. Quindi il compilatore sembra sapere tutto se una funzione può essere valutata in fase di compilazione o meno. Perché non è il comportamento predefinito e perché devo contrassegnare qualcosa come constexpr?Perché constexpr non è l'impostazione predefinita per tutte le funzioni?

+0

Per prima cosa alcune cose non sono consentite in una funzione 'constexpr', anche dopo i rilassamenti in C++ 14. – 101010

+2

Lo stesso si potrebbe dire di 'const' e' noexcept' a proposito. –

+0

Const è un po 'diverso a causa di const_cast e altre operazioni del puntatore. – Gzp

risposta

15

constexpr è una garanzia di interfaccia. Significa che puoi usare la funzione in espressioni costanti.

Una volta che le persone possono usarli in espressioni costanti, lo faranno. Ma cosa succede se non volevi che la tua funzione fosse usata in quel modo? Che cosa succede se in precedenza avevi un'implementazione semplice che poteva essere constexpr-possibile, ma in una revisione successiva devi modificarla (ad esempio perché ora devi aggiungere l'output del registro)?

Se si rimuove il marcatore constexpr, l'utilizzo nelle espressioni costanti interrompe la compilazione, quando ha funzionato prima e gli utenti della propria funzione saranno sconvolti. Meglio non rendere la funzione constexpr in primo luogo, consentendoti più libertà di cambiarla in seguito.

Ma se il compilatore rende automaticamente la tua funzione constexpr, non hai questa scelta.

+0

Quindi è una proprietà (interfaccia) di un'API progettata per l'uso "esterno" (ad esempio in una libreria) e non è compito del compilatore come ottimizzare. (È vero?) Se così fosse sarebbe stato meglio invertire la direzione e dichiarare esplicitamente che una funzione non è constexpr, ma che la retrocompatibilità era sparita (e avrebbe sicuramente altri problemi :)) – Gzp

+0

Sì, non ha molto a che fare con l'ottimizzazione. L'ottimizzazione viene eseguita in base a ciò che effettivamente fa il codice, non se è contrassegnato come constexpr o meno. Se la tua funzione è 'int f() {return 7; } 'e' int x = f() '; il codice sarà' x = 7; '. La propagazione costante è stata nei compilatori negli ultimi 25 anni, almeno. –

+0

@Gzp: constexpr (sulle funzioni) non ha nulla a che fare con le compilerzioni. – MikeMB

2

Come indicate here, fa differenza per utilizzare la funzione template specializzazione, definita con constexpr specificatore o non (es) SFINAE contesto:

L'aggiunta di constexpr provoca funzioni template da un'istanza in contesti non valutati che altrimenti non lo farebbero.

Quindi, a volte sarebbe un comportamento indesiderato avere tutte le funzioni implicitamente definite come constexpr.

Problemi correlati