2016-02-29 20 views
8

Quando definisco una funzione constexpr, dovrei dichiararla anche come noexcept? Immagino nel caso in cui gli argomenti e l'utilizzo soddisfino i requisiti per la valutazione in fase di compilazione, il significato di potenziali eccezioni è discutibile. Ma si applica normalmente ai casi in cui la funzione viene valutata in fase di esecuzione.Le funzioni `constexpr` dovrebbero anche essere` noxcept`?

È un dato di interesse pratico, se la funzione è davvero semplice, forse utilizzando built-in aritmetica o di un cast, in modo tale che mi aspetto che il compilatore può sempre inline la funzione e ottimizzare attraverso di esso, importa a l'efficienza del codice generato se lascio noexcept?

risposta

7

No, non dovresti.

"Can not fail" e "possono essere valutati in fase di compilazione" sono problemi ortogonali. Ad esempio, si desidera scrivere una funzione di potenza intera, ma si desidera prendere il potere come firmato (perché si ritiene che i numeri non firmati debbano essere utilizzati solo per casi molto speciali). Ora dici di voler fare un'eccezione se la potenza è negativa. In C++ 14 si può scrivere in questo modo:

constexpr int ipow(int base, int power) { 
    if (power < 0) throw std::domain_error("negative power"); 
    int result = 1; 
    for (int i = 0; i < power; ++i) result *= base; 
    return result; 
} 

Questa funzione chiaramente non è noexcept, ma per gli argomenti non negativi, si può ovviamente valutarla al momento della compilazione. Se lo provi per argomenti negativi in ​​un contesto in cui hai bisogno del risultato in fase di compilazione, ottieni un errore di compilazione, che dovrebbe andare bene.

Problemi correlati