C++
Parole chiave di dichiarazione variabile
Ricerca…
const
Un identificatore di tipo; quando viene applicato a un tipo, produce la versione const-qualified del tipo. Vedere la parola chiave const per i dettagli sul significato di 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
Rende il tipo del suo operando, che non viene valutato.
Se l'operando
e
è un nome senza parentesi aggiuntive,decltype(e)
è il tipo dichiarato die
.int x = 42; std::vector<decltype(x)> v(100, x); // v is a vector<int>
Se l'operando
e
è un membro della classe di accesso senza parentesi aggiuntivi, quindidecltype(e)
è il tipo dichiarato degli Stati accesso.struct S { int x = 42; }; const S s; decltype(s.x) y; // y has type int, even though s.x is const
In tutti gli altri casi,
decltype(e)
restituisce sia il tipo che la categoria di valore dell'espressionee
, come segue:- Se
e
è un lvalue di tipoT
, quindidecltype(e)
èT&
. - Se
e
è un xvalue di tipoT
,decltype(e)
èT&&
. - Se
e
è un valore di tipoT
, alloradecltype(e)
èT
Questo include il caso con parentesi estranee.
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
- Se
La forma speciale decltype(auto)
deduce il tipo di variabile dal suo inizializzatore o il tipo di ritorno di una funzione dalle dichiarazioni di return
nella sua definizione, usando le regole di deduzione di tipo di decltype
piuttosto che quelle di 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
firmato
Una parola chiave che fa parte di determinati nomi di tipi interi.
- Se usato da solo,
int
è implicito, così chesigned
,signed int
eint
sono dello stesso tipo. - Quando combinato con
char
, restituisce il tiposigned char
, che è un tipo diverso dachar
, anche sechar
è anche firmato.signed char
ha un intervallo che include almeno da -127 a +127 inclusi. - Se combinato con
short
,long
olong long
, è ridondante, poiché questi tipi sono già firmati. -
signed
non può essere combinato conbool
,wchar_t
,char16_t
, ochar32_t
.
Esempio:
signed char celsius_temperature;
std::cin >> celsius_temperature;
if (celsius_temperature < -35) {
std::cout << "cold day, eh?\n";
}
unsigned
Un identificatore di tipo che richiede la versione senza segno di un tipo intero.
- Se usato da solo,
int
è implicito, quindiunsigned
è lo stesso tipo diunsigned int
. - Il
unsigned char
è diverso dal tipochar
, anche sechar
non è firmato. Può contenere numeri interi fino ad almeno 255. -
unsigned
può anche essere combinato conshort
,long
olong long
. Non può essere combinato conbool
,wchar_t
,char16_t
ochar32_t
.
Esempio:
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
}
volatile
Un qualificatore di tipo; quando applicato a un tipo, produce la versione qualificata volatile del tipo. La qualifica volatile ha lo stesso ruolo della qualifica const
nel sistema di tipi, ma la volatile
non impedisce la modifica degli oggetti; al contrario, obbliga il compilatore a trattare tutti gli accessi a tali oggetti come effetti collaterali.
Nell'esempio seguente, se memory_mapped_port
non fosse volatile, il compilatore potrebbe ottimizzare la funzione in modo che esegua solo la scrittura finale, che sarebbe errata se sizeof(int)
è maggiore di 1. La qualifica volatile
lo costringe a trattare tutte le sizeof(int)
scrive come diversi effetti collaterali e quindi li esegue tutti (nell'ordine).
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];
}
}