programas macro funcion espaƱol ejemplo dev define constantes con c++ std constexpr numeric-limits

c++ - macro - Usando numeric_limits:: max() en expresiones constantes



funcion pi en c++ (5)

Me gustaría definir dentro de una clase una constante cuyo valor es el máximo int posible. Algo como esto:

class A { ... static const int ERROR_VALUE = std::numeric_limits<int>::max(); ... }

Esta declaración no se compila con el siguiente mensaje:

numeric.cpp: 8: error: ''std :: numeric_limits :: max ()'' no puede aparecer en una expresión constante numeric.cpp: 8: error: una llamada de función no puede aparecer en una expresión constante

Entiendo por qué esto no funciona, pero dos cosas me parecen extrañas:

  1. Me parece una decisión natural usar el valor en expresiones constantes. ¿Por qué los diseñadores de idiomas decidieron hacer max () una función y no permitir este uso?

  2. La especificación afirma en 18.2.1 que

    Para todos los miembros declarados const constantes en la plantilla numeric_limits, las especializaciones definirán estos valores de tal manera que sean utilizables como expresiones constantes integrales.

    ¿No significa que debería poder usarlo en mi escenario y no contradice el mensaje de error?

Gracias.


Mientras que el estándar actual carece de soporte aquí, para los tipos integrales Boost.IntegerTraits le proporciona las constantes de tiempo de compilación const_min y const_max .

El problema surge de §9.4.2 / 4 :

Si un miembro de datos estáticos es de tipo de enumeración constante o constante, su declaración en la definición de clase puede especificar un inicializador de constantes que será una expresión constante constante (5.19). En ese caso, el miembro puede aparecer en expresiones constantes integrales.

Tenga en cuenta que agrega:

El miembro aún se definirá en un ámbito de espacio de nombres si se usa en el programa y la definición del ámbito de espacio de nombres no contendrá un inicializador.

Como otros ya han mencionado, numeric_limit s min() y max() simplemente no son expresiones constantes integrales, es decir, compilan constantes de tiempo.


No contradice, porque max no está definido static const . Es solo una función miembro estática. Las funciones no pueden ser constantes, y las funciones miembro estáticas tampoco pueden tener una constante adjunta a la derecha.

También hay un double max() en la versión doble de los límites, y en C ++ 03 no funcionaría decir static double const max = ... Para ser consistente, max() es una función para todas las versiones de la plantilla de límite.

Ahora, se sabe que max() no se puede usar de esa manera, y C ++ 0x ya lo resuelve al convertirlo en una función constexpr , permitiendo su uso propuesto.


Parece un defecto ...

En C ++ 0x, numeric_limits tendrá todo lo marcado con constexpr , lo que significa que podrá usar min() y max() como constantes de tiempo de compilación.


Usted quiere:

#include <limits> struct A { static const int ERROR_VALUE; }; const int A::ERROR_VALUE = std::numeric_limits<int>::max();

Coloque la clase / estructura en un encabezado y la definición en un archivo .cpp.


  • Intentaré responderte tanto como entendí de tu pregunta:

1- Si quiere que se inicie una constante estática en su programa con una función:

int Data() { return rand(); } class A { public : static const int ee; }; const int A::ee=Data();

Esto funciona en VS 2008

2- Si desea obtener el número máximo y mínimo para un tipo de datos determinado, utilice estas definiciones INT_MAX, INT_MIN, LONG_MAX, etc.

3- Si, sin embargo, necesita usar estos tipos de plantilla wrt, codifique las plantillas usted mismo

template<> int MaxData() { return INT_MAX; }

y

template<> long MaxData() { return LONG_MAX ; }

y llamalos asi

int y=MaxData<int>();

4- y si solo está tratando con tipos binarios representados, entonces use esto:

template <class T> T MaxData(){ return ~(1<<((sizeof(T)*8)-1)); }

y esto

template <class T> T MinData(){ return (1<<((sizeof(T)*8)-1)); }

Espero que esto le pueda ayudar..