Qual é a diferença entre constexpre const? Quando posso usar apenas um deles? Quando posso usar os dois e como devo escolher
constexpr é um modificador introduzido em C ++ 11, que informa ao compilador que o valor de uma função ou variável é conhecido ou pode ser calculado em tempo de compilação. Como tal, pode ser usado como uma constante em lugares onde, de outra forma, não poderia ser.
Qual é a diferença entre constexpre const? Quando posso usar apenas um deles? Quando posso usar os dois e como devo escolher
Parece-me que ter uma "função que sempre retorna 5" está quebrando ou diluindo o significado de "chamar uma função". Deve haver um motivo ou uma necessidade desse recurso ou não seria no C ++ 11. Por que está aí? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int MeaningOfLife =...
Se eu tenho uma variável dentro de uma função (digamos, uma matriz grande), faz sentido declará-la statice constexpr? constexprgarante que a matriz é criada em tempo de compilação, então isso seria staticinútil? void f() { static constexpr int x [] = { // a few thousand elements }; // do...
Eu quero ter uma static const charmatriz na minha classe. O GCC reclamou e me disse que eu deveria usar constexpr, embora agora esteja me dizendo que é uma referência indefinida. Se eu fizer da matriz um não membro, ela será compilada. O que está acontecendo? // .hpp struct foo { void bar();...
Usando C ++ 11, Ubuntu 14.04, cadeia de ferramentas padrão do GCC . Este código falha: constexpr std::string constString = "constString"; erro: o tipo 'const string {aka const std :: basic_string}' da variável constexpr 'constString' não é literal ... porque ... 'std :: basic_string' possui um...
Considere a seguinte função embutida: // Inline specifier version #include<iostream> #include<cstdlib> inline int f(const int x); inline int f(const int x) { return 2*x; } int main(int argc, char* argv[]) { return f(std::atoi(argv[1])); } e a versão equivalente constexpr: //...
No final da palestra de Scott Schurr "Apresentando constexpr" na CppCon , ele pergunta "Existe uma maneira de envenenar uma função"? Ele então explica que isso pode ser feito (embora de uma forma não padronizada) por: Colocando um throwem uma constexprfunção Declarando um não resolvido extern...
Onde devo preferir usar macros e onde devo preferir constexpr ? Eles não são basicamente os mesmos? #define MAX_HEIGHT 720 vs constexpr unsigned int max_height = 720;
Estou tentando calcular o comprimento de uma string literal em tempo de compilação. Para fazer isso, estou usando o seguinte código: #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"),...
Eu tenho uma função que tem uma std::vectordimensão multidimensional e requer que a profundidade (ou o número de dimensões) seja passada como um parâmetro de modelo. Em vez de codificar esse valor, eu gostaria de escrever uma constexprfunção que aceite std::vectore retorne a profundidade como um...
TL; DR Antes de tentar ler esta postagem inteira, saiba que: uma solução para o problema apresentado foi encontrada por mim , mas ainda estou ansioso para saber se a análise está correta; Empacotei a solução em uma fameta::counterclasse que resolve algumas peculiaridades restantes. Você pode...
Nossa equipe está trabalhando com uma base de código C ++ com mais de 10 anos e recentemente mudou para um compilador C ++ 17. Então, estamos procurando maneiras de modernizar nosso código. Em uma conferência no YouTube, ouvi a sugestão de substituir const char*as cordas globais por constexpr...
Eu estava brincando com autono std::pair. No código abaixo, a função fdeve retornar um std::pairdos tipos que dependem de um parâmetro de modelo. Um exemplo de trabalho: EXEMPLO 1 template <unsigned S> auto f() { if constexpr (S == 1) return std::pair{1, 2}; // pair of ints else if...
Eu estava brincando com c ++ 20 consteval no GCC 10 e escrevi este código #include <optional> #include <tuple> #include <iostream> template <std::size_t N, typename Predicate, typename Tuple> consteval std::optional<std::size_t> find_if_impl(Predicate&&...
Isso é válido em C ++? int main() { constexpr auto sz = __func__ - __func__; return sz; } O GCC e o MSVC acham que está tudo bem, Clang acha que não: o Compiler Explorer . Todos os compiladores concordam que este está correto: Explorer do compilador . int main() { constexpr auto p =...
No C ++ 20, std::swaptorna-se uma constexprfunção. Eu sei que a biblioteca padrão realmente ficou para trás da linguagem na marcação de coisas constexpr, mas em 2017, ela <algorithm>estava praticamente consexprada como muitas outras coisas. No entanto - std::swapnão era. Lembro-me vagamente...
Eu tenho experimentado expressões const que são avaliadas em tempo de compilação. Mas eu brinquei com um exemplo que parece incrivelmente rápido quando executado em tempo de compilação. #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); }...
Todos os construtores de std :: span são declarados constexpr, no entanto, não consigo fazer com que nenhum deles funcione em um contexto constexpr. Descomentar qualquer um dos constexpr abaixo resultará em um erro de compilação. #include <array> #include <span> int main() {...
O código a seguir é legítimo? template <int N> class foo { public: constexpr foo() { for (int i = 0; i < N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo<5> bar; Clang aceita, mas GCC e MSVC rejeitam. O erro do GCC é: main.cpp:15:18: error: 'constexpr...