constexpr
é similar ao especificador const
, a diferença é que ela é aplicável a mais tipos , como por exemplo, também em funções-membro estáticas e entre outros.
Logicamente, assim como const
e auto
, ela requer inicialização no momento da declaração. No Curso de C++ Moderno Avançado
abordamos de forma mais detalhada sobre constexpr
. Mas em resumo é:
O cálculo é feito em tempo de compilação ganhando um desempenho muito superior do que se não usasse
constexpr
. Exemplo de uso:
constexpr int x = (9 + 3) / ( 2 * 2 ) - 1;
Para obter dados da execução você pode usar o comando: time.
Para mais informações sobre constexpr
veja aqui .
consteval
?consteval
pode ser resumido como uma melhoria do constexpr
. Conceitualmente falando, de acordo com o cppreference , é um especificador que declara uma função ou modelo para ser uma função imediata .
Isso acima soou um pouco difícil de entender, mas em resumo é que a documentação se refere à ordem de execução.
O constexpr
deixava “dúvidas” de qual seria o resultado após múltiplas utilizações para funções, o programadores tinham aquela sensação de que rodou em tempo de execução, logo, o consteval
foi implementado a partir do C++20 para resolver essas discrepâncias.
Abaixo segue alguns exemplos de uso do consteval
Note que ela é usada para FUNÇÕES e só compila com
-std=c++20
ou superior, avise isso à seu LSP! 😃
#include <iostream>
consteval unsigned ret_calc(int first_num){
return (first_num + 3) / ( 2 * 2 ) - 1;
}
consteval int make_double(unsigned x){
return 2 * x;
}
consteval auto self_mult(auto num){
return num * num;
}
consteval static int increment(double x){
return ++x;
}
int main(){
// consteval int y = (9 + 3) / ( 2 * 2 ) - 1; // diferente de constexpr, isso não compila
std::cout << ret_calc(9) << '\n';
std::cout << make_double(3) << '\n';
std::cout << self_mult(39.6f) << '\n';
std::cout << increment(6) << '\n';
}