C++
Palabras clave de la declaración variable
Buscar..
const
Un especificador de tipo; cuando se aplica a un tipo, produce la versión const-calificada del tipo. Consulte la palabra clave const para obtener detalles sobre el significado de const
.
const int x = 123;
x = 456; // error
int& r = x; // error
struct S {
void f();
void g() const;
};
const S s;
s.f(); // error
s.g(); // OK
decltype
Cede el tipo de su operando, que no se evalúa.
Si el operando
e
es un nombre sin paréntesis adicionales, entoncesdecltype(e)
es el tipo declarado dee
.int x = 42; std::vector<decltype(x)> v(100, x); // v is a vector<int>
Si el operando
e
es un acceso de miembro de clase sin paréntesis adicionales, entoncesdecltype(e)
es el tipo declarado del miembro al que se accedió.struct S { int x = 42; }; const S s; decltype(s.x) y; // y has type int, even though s.x is const
En todos los demás casos,
decltype(e)
produce tanto el tipo como la categoría de valor de la expresióne
, como sigue:- Si
e
es un valor de tipoT
, entoncesdecltype(e)
esT&
. - Si
e
es un xvalor de tipoT
, entoncesdecltype(e)
esT&&
. - Si
e
es un prvalor de tipoT
, entoncesdecltype(e)
esT
Esto incluye el caso con paréntesis extraños.
int f() { return 42; } int& g() { static int x = 42; return x; } int x = 42; decltype(f()) a = f(); // a has type int decltype(g()) b = g(); // b has type int& decltype((x)) c = x; // c has type int&, since x is an lvalue
- Si
La forma especial decltype(auto)
deduce el tipo de una variable de su inicializador o el tipo de retorno de una función de las declaraciones de return
en su definición, utilizando las reglas de deducción de decltype
de decltype
lugar de las de auto
.
const int x = 123;
auto y = x; // y has type int
decltype(auto) z = x; // z has type const int, the declared type of x
firmado
Una palabra clave que forma parte de ciertos nombres de tipo entero.
- Cuando se usa solo,
int
está implícito, de modo quesigned
,signed int
eint
son del mismo tipo. - Cuando se combina con
char
, produce el tiposigned char
, que es un tipo diferente dechar
, incluso sichar
también está firmado.signed char
tiene un rango que incluye al menos -127 a +127, ambos inclusive. - Cuando se combina con
short
,long
olong long
, es redundante, ya que esos tipos ya están firmados. -
signed
no se puede combinar conbool
,wchar_t
,char16_t
ochar32_t
.
Ejemplo:
signed char celsius_temperature;
std::cin >> celsius_temperature;
if (celsius_temperature < -35) {
std::cout << "cold day, eh?\n";
}
no firmado
Un especificador de tipo que solicita la versión sin firmar de un tipo entero.
- Cuando se usa solo,
int
está implícito, por lo queunsigned
es del mismo tipo queunsigned int
. - El tipo
unsigned char
es diferente del tipochar
, incluso sichar
no está firmado. Puede contener enteros hasta al menos 255. -
unsigned
también se puede combinar conshort
,long
olong long
. No se puede combinar conbool
,wchar_t
,char16_t
ochar32_t
.
Ejemplo:
char invert_case_table[256] = { ..., 'a', 'b', 'c', ..., 'A', 'B', 'C', ... };
char invert_case(char c) {
unsigned char index = c;
return invert_case_table[index];
// note: returning invert_case_table[c] directly does the
// wrong thing on implementations where char is a signed type
}
volátil
Un calificador de tipo; cuando se aplica a un tipo, produce la versión calificada volátil del tipo. La calificación volátil desempeña el mismo papel que la calificación const
en el sistema de tipos, pero la volatile
no impide que se modifiquen los objetos; en cambio, obliga al compilador a tratar todos los accesos a tales objetos como efectos secundarios.
En el ejemplo a continuación, si memory_mapped_port
no fuera volátil, el compilador podría optimizar la función para que realice solo la escritura final, lo que sería incorrecto si sizeof(int)
es mayor que 1. La calificación de volatile
obliga a tratar todo sizeof(int)
escribe como diferentes efectos secundarios y, por tanto, realiza todos ellos (en orden).
extern volatile char memory_mapped_port;
void write_to_device(int x) {
const char* p = reinterpret_cast<const char*>(&x);
for (int i = 0; i < sizeof(int); i++) {
memory_mapped_port = p[i];
}
}