C++
Nyckelord med variabel deklaration
Sök…
const
En typspecifikation; när den tillämpas på en typ, producerar den const-kvalificerade versionen av typen. Se const nyckelord för information om betydelsen av 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
Ger typ av operand, som inte utvärderas.
Om operand
eär ett namn utan ytterligare parenteser, ärdecltype(e)den deklarerade typen ave.int x = 42; std::vector<decltype(x)> v(100, x); // v is a vector<int>Om operand
eär en klassmedlemstillträde utan några extra parenteser, ärdecltype(e)den deklarerade typen av medlem som åtkomst till.struct S { int x = 42; }; const S s; decltype(s.x) y; // y has type int, even though s.x is constI alla andra fall ger
decltype(e)både typen och värdekategorin för uttryckete, enligt följande:- Om
eär en lvalue av typT, ärdecltype(e)T&. - Om
eär en xvalue av typT, ärdecltype(e)T&&. - Om
eär en uppskattning av typT, ärdecltype(e)T
Detta inkluderar fallet med främmande parenteser.
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- Om
Den speciella formen decltype(auto) härleder typen av en variabel från dess initierare eller retur typ av funktion från return uttalanden i sin definition, med hjälp av typ avdragsregler för decltype snarare än 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
signerad
Ett nyckelord som är en del av vissa namn på heltalstyp.
- När den används ensam antyds
int, så attsigned,signed intochintär samma typ. - I kombination med
charger du den typsigned char, som är en annan typ änchar, även omcharär signerad.signed charhar ett intervall som inkluderar minst -127 till +127, inklusive. - I kombination med
short,longellerlong longär det överflödigt eftersom dessa typer redan är signerade. -
signedkan inte kombineras medbool,wchar_t,char16_tellerchar32_t.
Exempel:
signed char celsius_temperature;
std::cin >> celsius_temperature;
if (celsius_temperature < -35) {
std::cout << "cold day, eh?\n";
}
osignerad
En typspecifikation som begär den osignerade versionen av en heltalstyp.
- När den används ensam antyds
int, såunsignedär samma typ somunsigned int. - Typen
unsigned charskiljer sig frånchar, även omcharär osignerad. Det kan innehålla heltal upp till minst 255. -
unsignedkan också kombineras medshort,longellerlong long. Det kan inte kombineras medbool,wchar_t,char16_tellerchar32_t.
Exempel:
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
}
flyktig
En typkvalificering; när den tillämpas på en typ, producerar den flyktiga kvalificerade versionen av typen. Flyktig kvalifikation spelar samma roll som const kvalificering i typsystemet, men volatile förhindrar inte att objekt kan modifieras; istället tvingar den kompilatorn att behandla alla åtkomst till sådana objekt som biverkningar.
I exemplet nedan, om memory_mapped_port inte var flyktiga, skulle kompilatorn kunna optimera funktionen så att den endast utför den slutliga skrivningen, vilket skulle vara fel om sizeof(int) är större än 1. Den volatile kvalificeringen tvingar den att behandla alla sizeof(int) skriver som olika biverkningar och därmed utföra dem alla (i ordning).
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];
}
}