Cuál es la diferencia entre constexpr y const? ¿Cuándo puedo usar solo uno de ellos? ¿Cuándo puedo usar ambos y cómo debo elegir
constexpr es un modificador introducido en C ++ 11, que informa al compilador que el valor de una función o variable es conocido o puede calcularse en tiempo de compilación. Como tal, puede usarse como una constante en lugares donde de otra manera no podría ser.
Cuál es la diferencia entre constexpr y const? ¿Cuándo puedo usar solo uno de ellos? ¿Cuándo puedo usar ambos y cómo debo elegir
Me parece que tener una "función que siempre devuelve 5" es romper o diluir el significado de "llamar a una función". Debe haber una razón, o una necesidad de esta capacidad o no estaría en C ++ 11. ¿Por qué está ahí? // preprocessor. #define MEANING_OF_LIFE 42 // constants: const int...
Si tengo una variable dentro de una función (por ejemplo, una gran matriz), ¿tiene sentido declarar ambas staticy constexpr? constexprgarantiza que la matriz se crea en tiempo de compilación, entonces, ¿ staticsería inútil? void f() { static constexpr int x [] = { // a few thousand elements };...
Quiero tener una static const charmatriz en mi clase. GCC se quejó y me dijo que debería usar constexpr, aunque ahora me dice que es una referencia indefinida. Si hago que la matriz no sea miembro, entonces se compila. Que esta pasando? // .hpp struct foo { void bar(); static constexpr char...
Usando C ++ 11, Ubuntu 14.04, cadena de herramientas predeterminada de GCC . Este código falla: constexpr std::string constString = "constString"; error: el tipo 'const string {aka const std :: basic_string}' de la variable constexpr 'constString' no es literal ... porque ... 'std ::...
Considere la siguiente función en línea: // 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])); } y la versión equivalente...
Al final de la charla de Scott Schurr "Introducing constexpr" en CppCon , pregunta "¿Hay alguna manera de envenenar una función"? Luego explica que esto se puede hacer (aunque de una manera no estándar) mediante: Poner un throwen una constexprfunción Declarando un no resuelto extern const...
Estoy tratando de calcular la longitud de una cadena literal en tiempo de compilación. Para hacerlo, estoy usando el siguiente código: #include <cstdio> int constexpr length(const char* str) { return *str ? 1 + length(str + 1) : 0; } int main() { printf("%d %d", length("abcd"),...
¿Dónde debería preferir usar macros y dónde debería preferir constexpr ? ¿No son básicamente iguales? #define MAX_HEIGHT 720 vs constexpr unsigned int max_height = 720;
Tengo una función que toma una std::vectordimensión multidimensional y requiere que se pase la profundidad (o el número de dimensiones) como parámetro de plantilla. En lugar de codificar este valor, me gustaría escribir una constexprfunción que tome std::vectory devuelva la profundidad como...
TL; DR Antes de intentar leer esta publicación completa, sepa que: Yo mismo he encontrado una solución al problema presentado , pero todavía estoy ansioso por saber si el análisis es correcto; He empaquetado la solución en una fameta::counterclase que resuelve algunas peculiaridades restantes....
Nuestro equipo está trabajando con una base de código C ++ de más de 10 años y recientemente se cambió a un compilador C ++ 17. Por lo tanto, estamos buscando formas de modernizar nuestro código. En una conferencia en YouTube escuché la sugerencia de reemplazar const char*cadenas globales con...
Estaba jugando con autoadentro std::pair. En el siguiente código, fse supone que la función devuelve una std::pairde los tipos que dependen de un parámetro de plantilla. Un ejemplo de trabajo: EJEMPLO 1 template <unsigned S> auto f() { if constexpr (S == 1) return std::pair{1, 2}; //...
Estaba jugando con c ++ 20 consteval en GCC 10 y escribí 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&& pred,...
¿Es esto válido C ++? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC y MSVC piensan que está bien, Clang cree que no: Compiler Explorer . Todos los compiladores están de acuerdo en que este está bien: Compiler Explorer . int main() { constexpr auto p = __func__;...
En C ++ 20, se std::swapconvierte en una constexprfunción. Sé que la biblioteca estándar realmente se quedó atrás del lenguaje al marcar cosas constexpr, pero para 2017, <algorithm>era bastante importante, al igual que muchas otras cosas. Sin embargo, std::swapno lo fue. Recuerdo vagamente...
He estado probando expresiones constantes que se evalúan en tiempo de compilación. Pero jugué con un ejemplo que parece increíblemente rápido cuando se ejecuta en tiempo de compilación. #include<iostream> constexpr long int fib(int n) { return (n <= 1)? n : fib(n-1) + fib(n-2); }...
Todos los constructores de std :: span se declaran constexpr, sin embargo, parece que no puedo hacer que ninguno de ellos funcione en un contexto constexpr. Descomentar cualquiera de los constexpr a continuación dará como resultado un error de compilación. #include <array> #include...
¿Es legítimo el siguiente código? 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 lo acepta, pero GCC y MSVC lo rechazan. El error de GCC es: main.cpp:15:18: error:...