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.

questionAnswers(14)

yourAnswerToTheQuestion