constexpr overloading
Related: A função retornando constexpr não compila
Sinto-me como constexpr é de utilidade limitada em C ++ 11 devido à incapacidade de definir duas funções que de outra forma teriam a mesma assinatura, mas uma delas é constexpr e a outra não constexpr. Em outras palavras, seria muito útil se eu pudesse ter, por exemplo, um construtor constexpr std :: string que use apenas argumentos constexpr e um construtor não constexpr std :: string para argumentos não constexpr. Outro exemplo seria uma função teoricamente complicada que poderia se tornar mais eficiente usando o estado. Você não pode fazer isso facilmente com uma função constexpr; portanto, você tem duas opções: tenha uma função constexpr muito lenta se passar argumentos não constexpr ou desistir completamente do constexpr (ou escrever duas funções separadas, mas talvez você não saiba qual versão chamar).
Minha pergunta, portanto, é esta:
É possível que uma implementação C ++ 11 compatível com o padrão permita sobrecarga de função com base nos argumentos constexpr, ou isso exigiria a atualização do padrão? Se não for permitido, não foi intencionalmente permitido?
icolBolas: Digamos que eu tenho uma função que mapeia umenum
para umstd::string
. A maneira mais direta de fazer isso, supondo que meuenum
vai de0
paran - 1
, é criar uma matriz de tamanhon
preenchido com o resultado.
Eu poderia criar umstatic constexpr char const * []
e construa umstd::string
no retorno (pagando o custo de criar umstd::string
toda vez que chamo a função) ou posso criar umstatic std::string const []
e retorne o valor que procuro, pagando o custo de todos osstd::string
construtores na primeira vez que chamo a função Parece que uma solução melhor seria criar ostd::string
na memória em tempo de compilação (semelhante ao que é feito agora comchar const *
), mas a única maneira de fazer isso seria alertar o construtor de que ele temconstexpr
argumentos.
Para um exemplo diferente destd::string
construtor, acho bastante simples encontrar um exemplo em que, se você pudesse ignorar os requisitos deconstexpr
(e, portanto, crie um nãoconstexpr
function), você pode criar uma função mais eficiente. Considere este tópico:constexpr pergunta, por que esses dois programas diferentes são executados em uma quantidade tão diferente de tempo com o g +
Se eu ligarfib
com umconstexpr
argumento, não posso vencer fazer melhor do que o compilador otimizando completamente a chamada de função. Mas se eu ligar parafib
com um nãoconstexpr
argumento, convém que ele chame minha própria versão que implementa coisas como memorização (o que exigiria estado), para que eu tenha um tempo de execução semelhante ao que teria sido meu tempo de compilação se eu passasse umconstexpr
argumento.