videos tres niveles los literal lectura lectora inferencial ejercicios ejemplos critico comprensión comprension caracteristicas c++

c++ - tres - Necesita aclaración sobre definición de tipo literal



niveles de lectura literal inferencial y critico ejemplos (2)

C ++ 11 (n3485), [tipos de información básicos] 9-10

Los tipos aritméticos, los tipos de enumeración, los tipos de puntero, los tipos de puntero a miembro, std::nullptr_t , y las versiones calificadas de std::nullptr_t de estos tipos se denominan colectivamente tipos escalares [...]

Un tipo es un tipo literal si es:

  • un tipo escalar; o
  • un tipo de referencia; o
  • una matriz de tipo literal; o
  • un tipo de clase que tiene todas las siguientes propiedades:
    • tiene un destructor trivial,
    • Cada llamada de constructor y expresión completa en los inicializadores de corsé o igual para miembros de datos no estáticos (si los hay) es una expresión constante,
    • es un tipo agregado o tiene al menos un constructor constexpr o plantilla de constructor que no es un constructor de copia o movimiento, y
    • todos sus miembros de datos no estáticos y sus clases base son de tipos literales no volátiles.

[dcl.init.aggr] / 1

Un agregado es una matriz o una clase sin constructores proporcionados por el usuario, sin inicializadores con refuerzo o igual para los miembros de datos no estáticos, no hay miembros de datos no estáticos privados o protegidos, no hay clases base y no hay funciones virtuales.

El libro que estoy leyendo con frecuencia menciona que un tipo debe ser literal para usar en ciertas situaciones, como los tipos que pueden usar constexpr. Pero la única definición dada fue que los tipos literales son aritméticos, de referencia o de tipo puntero. Pero cuando definimos un tipo constexpr, parece que se tiene que inicializar con un literal o una variable que originalmente se inicializó con un literal.

Estoy confundido con lo que califica como un tipo literal y lo que no.


De C ++ 11, 3.9 / 10:

Un tipo es un tipo literal si es:

  • un tipo escalar; o
  • un tipo de referencia; o
  • una matriz de tipo literal; o
  • un tipo de clase (Cláusula 9) que tiene todas las siguientes propiedades:
    • tiene un destructor trivial,
    • cada llamada de constructor y expresión completa en los inicializadores con o sin llave para los miembros de datos no estáticos (si existen) es una expresión constante (5.19),
    • es un tipo agregado (8.5.1) o tiene al menos un constructor constexpr o plantilla de constructor que no es un constructor de copia o movimiento, y
    • todos sus miembros de datos no estáticos y clases base son de tipos literales.

Así que básicamente es una referencia, un tipo de objeto primitivo o algo que puede construirse a partir de un tipo literal en una forma constexpr (arrays, agregados o clases con constexpr constructor).