Creo que en C++14 más restrictives se quitan de constexpr. Pero de acuerdo N3797 7.1.5 de 3 punct:


La definición de un contexpr función shal cumplir con las siguientes restricciones:

  • no será virtual
  • el tipo de devolución será de tipo literal;
  • cada uno de sus parámetros de tipos debe ser un literal de tipo;
  • su función de cuerpo será = eliminar, = defecto, o un compuesto declaración que no contiene:
    • un asm-definición,
    • un goto declaración,
    • un tratar de bloque, o
    • una definición de una variable de la no-literal de tipo o de estática o de hilo tiempo de almacenamiento o para las que no la inicialización es
      se realizó.


Sé por qué estática, hilo de almacenamiento de duración variables no están permitidas, pero no veo ninguna razón, ¿por qué SÓLO se permite la definición de una variable de tipo literal ?

O no estoy de entender la norma.

No estoy seguro, pero según el estándar de errores siguientes debe ser creado hasta el C++14:

struct point{
constexpr point(): x(0), y(0){}
constexpr point(int x_, int y_): x(x_),y(y_){}
constexpr int hypot()const { return x*x + y*y; }
int x,y;
};

constexpr int hypot(int x, int y) {  
   point p{x,y}; //error, because p - is not literal type.
   return p.hypot();
}

//error, because return type is not literal.
constexpr point  getPoint(int x, int y) { return {x,y}; }

//error, because parameter is not literal.
constexpr int hypot(point p) { return p.hypot(); }

P: Si realmente por encima de los errores que iba a pasar, ¿por qué estas restrics no se quitan?

OriginalEl autor Khurshid | 2014-02-14

1 Comentario

  1. 12

    de tipo literal se define en 3.9/10:

    Un tipo es una de tipo literal si es:

    • void; o

    • un tipo escalar; o

    • un tipo de referencia; o

    • una matriz de tipo literal; o

    • de un tipo de clase (Cláusula 9) que tiene todas las propiedades siguientes:

      • tiene un trivial destructor,

      • es un tipo agregado (8.5.1) o tiene al menos un constexpr constructor o constructor de plantilla que no es una copia o mueve constructor, y

      • todas las de su no-miembros de datos estáticos y clases base de la no-volátil literal de los tipos de

    Por lo que su estructura point es un tipo literal y su código de ejemplo es válido en C++1y.

    De por qué constexpr funciones están restringidas a las variables de tipo literal, son los únicos tipos que están garantizados para ser interpretables en tiempo de compilación.

    Gracias, pensé que literal tipos sólo son integer, char, string literal y flotar literales. Puedo solucionar getPoint.

    OriginalEl autor Casey

Dejar respuesta

Please enter your comment!
Please enter your name here