Domanda

Imparentato: Funzione di ritorno costexpr non si compila

Sento che Contexpr è limitato nell'utilità in C ++ 11 a causa dell'incapacità di definire due funzioni che altrimenti avrebbero la stessa firma, ma che ne sono una costexpr e l'altra non Contexpr. In altre parole, sarebbe molto utile se potessi, ad esempio, un costruttore di costexpr std :: string che prende solo argomenti di costexpr e un costruttore String non-ConstExpr STD :: String per argomenti non-non-non-Contexpr. Un altro esempio sarebbe una funzione teoricamente complicata che potrebbe essere resa più efficiente usando lo stato. Non è possibile farlo facilmente con una funzione costexpr, quindi sei lasciato con due scelte: avere una funzione costexpr che è molto lenta se si passa in argomenti non con non-non-non-non-non-non-non-non-non-non- ma potresti non sapere quale versione chiamare).

La mia domanda, quindi, è questa:

È possibile per un'implementazione C ++ 11 conforme standard per consentire il sovraccarico di funzioni in base agli argomenti che sono costexpr o ciò richiederebbe l'aggiornamento dello standard? Se non è consentito, non era intenzionalmente consentito?


@Nicolbolas: dì che ho una funzione che mappa un enum a a std::string. Il modo più diretto per farlo, supponendo il mio enum va da 0 a n - 1, è creare una matrice di dimensioni n riempito con il risultato.

Potrei creare un static constexpr char const * [] e costruisci a std::string al ritorno (pagando il costo della creazione di un std::string oggetto ogni volta che chiamo la funzione), oppure posso creare un static std::string const [] e restituire il valore che cerco, pagando il costo di tutto il std::string costruttori la prima volta che chiamo la funzione. Sembra che una soluzione migliore sarebbe quella di creare il std::string in memoria al momento della compilazione (simile a quello che viene fatto ora con char const *), ma l'unico modo per farlo sarebbe quello di avvisare il costruttore che ha constexpr argomenti.

Per un esempio diverso da a std::string costruttore, penso che sia piuttosto diretto trovare un esempio in cui, se si potesse ignorare i requisiti di constexpr (e quindi crea un nonconstexpr funzione), è possibile creare una funzione più efficiente. Considera questo thread: Domanda di Contexpr, perché questi due diversi programmi eseguono in una quantità così diversa di tempo con G ++?

Se chiamo fib con un constexpr Argomento, non posso battere meglio del compilatore che ottimizza completamente la chiamata della funzione. Ma se chiamo fib con un nonconstexpr argomento, potrei voler chiamarla la mia versione che implementa cose come la memorizzazione (che richiederebbe lo stato), quindi ho tempo di esecuzione simile a quello che sarebbe stato il mio tempo di compilazione se avessi superato un constexpr discussione.

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top