¿Cada tipo tiene un literal correspondiente?

De acuerdo con los Principios y Prácticas de Progtwigción de Bjarne Stroustrup Usando C ++ (Sexta Impresión, Noviembre de 2012) , “cada uno de [los] tipos [ int , double , char , string , y bool ] tiene su propio estilo característico de literales” (p.63) .

En §A.2 del mismo libro, se mencionan variedades adicionales de int (unsigned; long) y literales de coma flotante, así como el puntero literal (nulo).

¿ Cada tipo tiene un literal correspondiente?

Norma C ++ n3337 § 2.14.1 / 1:

Hay varios tipos de literales.

literal:

entero-literal

carácter literal

literal-flotante

cadena literal

booleano-literal

puntero-literal

literal definido por el usuario

No, no todos los tipos tienen un literal. Las clases no tienen literal, así como, por ejemplo, void , int* , signed char , unsigned char , short , unsigned short .


Los literales explicaron:

entero-literal

Un literal entero es una secuencia de dígitos que no tiene parte de período o exponente.

ejemplo: 1

carácter literal

Un literal de carácter es uno o más caracteres encerrados entre comillas simples, como en ‘x’, opcionalmente precedido por una de las letras u, U o L, como en u’y ‘, U’z’ o L’x ‘ , respectivamente.

‘secuencia de c-char’

u ‘secuencia de c-char’

U ‘c-char-secuencia’

L ‘c-char-secuencia’

ejemplo: 'a' , 'ab' , '\'' , L'0' , '('

literal-flotante

Un literal flotante consiste en una parte entera, un punto decimal, una parte de fracción, una eo E, un exponente entero con signo opcional y un sufijo de tipo opcional. Las partes de entero y fracción consisten en una secuencia de dígitos decimales (base diez). Se puede omitir la parte entera o la parte de la fracción (no ambas); se puede omitir el punto decimal o la letra e (o E) y el exponente (no ambos). La parte entera, el punto decimal opcional y la parte de fracción opcional forman la parte significativa del literal flotante. El exponente, si está presente, indica la potencia de 10 por la cual se escalará la parte significativa.

ejemplo: 123.456e-67 , .1E1f , 42. , 1 3e3

cadena literal

Un literal de cadena es una secuencia de caracteres (como se define en 2.14.3) rodeada por comillas dobles, opcionalmente con el prefijo R, u8, u8R, u, uR, U, UR, L o LR, como en “…” , R “(…)”, u8 “…”, u8R ” (…) “, u “…”, uR “* ̃ (…) * ̃”, U “.. . “, UR” zzz (…) zzz “, L” … “, o LR” (…) “, respectivamente.

encoding-prefixopt “s-char-sequenceopt”

encoding-prefixopt R raw-string

ejemplo: "me" , L"you"

booleano-literal

Los literales booleanos son las palabras clave false y true . Tales literales son prvalues y tienen tipo bool .

 false true 

puntero-literal

El puntero literal es la palabra clave nullptr . Es un prvalue de tipo std::nullptr_t .

 nullptr 

literal definido por el usuario

Sobrecarga del operator"" que permite interpretar el literal utilizando la lógica definida por el usuario.

ejemplo:

 typedef double signalf; constexpr signalf operator"" _percent( long double val) { return val / 100 ; } std::cout << 12.34_percent; // prints 0.1234 

No hay literal para int* . Lo más cercano que obtienes es nullptr , pero su tipo es nullptr_t .

La mayoría de los tipos no tienen un literal. Las clases no tienen uno. Los punteros, las referencias, las referencias de valor r no tienen ninguno, también. void no tiene un literal.

Usted mencionó una string que tampoco tiene un literal, solo tiene un constructor que toma un const char* literal! C ++ llama a este constructor implícitamente, cuando asigna un const char* literal a una cadena.

Agregando a la lista, no hay literales para signed char , unsigned char , short , unsigned short .

Probablemente debería pensar en términos de la lista limitada de tipos para los cuales hay literales, en lugar de los tipos para los que no existen. Los literales son para:

  • bool
  • char, wchar_t, char16_t, char32_t
  • “array of const” char, wchar_t, char16_t, char32_t (es decir, literales de cadena)
  • int, unsigned int
  • largo, sin firmar largo
  • long long, unsigned long long
  • flotador, doble, largo doble
  • std :: nullptr_t

más literales definidos por el usuario.

En primer lugar, el tipo std::string no tiene sus propios literales. Sólo los tipos aritméticos tienen sus propios literales. La excepción son los literales de cadena que tienen tipos de const char arrays de caracteres const char arrays y no se han introducido en el nullptr C ++ 11 de tipo std::nullptr_t

Ten en cuenta que bool es un tipo aritmético.

Los Principios y Prácticas de Progtwigción de Bjarne Stroustrup Usando C ++ (Sexta Impresión, Noviembre de 2012) se refieren a ISO / IEC 14882: 2003 como el estándar relevante de C ++. En este se puede encontrar la sección pertinente, §2.13, que dice lo siguiente:

 2.13 Literals There are several kinds of literals. literal: integer-literal character-literal floating-literal string-literal boolean-literal 

Al parecer, esta es una lista exhaustiva; y debido a que puede haber muchos más tipos que tipos de literales en esa lista, la respuesta es: no, no todos los tipos tienen un literal correspondiente.

Nota para el caso de C ++ 11, consulte la respuesta de Lizusek .