C++
Mots-clés de déclaration de variable
Recherche…
const
Un spécificateur de type; Appliqué à un type, génère la version qualifiée du type. Voir le mot-clé const pour plus de détails sur la signification 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
Donne le type de son opérande, qui n'est pas évalué.
Si l'opérande
eest un nom sans parenthèses supplémentaires,decltype(e)est le type déclaré dee.int x = 42; std::vector<decltype(x)> v(100, x); // v is a vector<int>Si l'opérande
eest un accès de membre de classe sans parenthèses supplémentaires,decltype(e)est le type déclaré du membre accédé.struct S { int x = 42; }; const S s; decltype(s.x) y; // y has type int, even though s.x is constDans tous les autres cas,
decltype(e)fournit à la fois le type et la catégorie de valeur de l'expressione, comme suit:- Si
eest une lvalue de typeT, alorsdecltype(e)estT&. - Si
eest une valeur x de typeT, alorsdecltype(e)estT&&. - Si
eest une valeur de typeT, alorsdecltype(e)estT
Cela inclut le cas avec des parenthèses étrangères.
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 forme spéciale decltype(auto) déduit le type d'une variable de son initialiseur ou le type de retour d'une fonction des instructions de return dans sa définition, en utilisant les règles de déduction de type de decltype plutôt que celles 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
signé
Un mot-clé qui fait partie de certains noms de type entier.
- Utilisé seul,
intest implicite, de sorte quesigned,signed intetintsont du même type. - Lorsqu'il est combiné avec l'
char, donne le typesigned char, qui est un type différent dechar, même sicharest également signé.signed chara une portée qui comprend au moins -127 à +127 inclus. - Lorsqu'il est associé à un format
short,longoulong long, il est redondant, car ces types sont déjà signés. -
signedne peut pas être combiné avecbool,wchar_t,char16_touchar32_t.
Exemple:
signed char celsius_temperature;
std::cin >> celsius_temperature;
if (celsius_temperature < -35) {
std::cout << "cold day, eh?\n";
}
non signé
Un spécificateur de type qui demande la version non signée d'un type entier.
- Utilisé seul,
intest implicite, doncunsignedest du même type queunsigned int. - Le type
unsigned charest différent du typechar, même sicharn'est pas signé. Il peut contenir des nombres entiers jusqu’à 255. -
unsignedpeut également être combiné avecshort,longoulong long. Il ne peut pas être combiné avecbool,wchar_t,char16_touchar32_t.
Exemple:
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
}
volatil
Un qualificatif de type; appliqué à un type, produit la version qualifiée volatile du type. La qualification volatile joue le même rôle que la qualification const dans le système de type, mais volatile n'empêche pas la modification des objets; au contraire, il oblige le compilateur à traiter tous les accès à de tels objets comme des effets secondaires.
Dans l'exemple ci-dessous, si memory_mapped_port n'était pas volatile, le compilateur pourrait optimiser la fonction afin qu'elle n'effectue que l'écriture finale, ce qui serait incorrect si sizeof(int) est supérieur à 1. La qualification volatile oblige à traiter toutes les sizeof(int) écrit en tant qu'effets secondaires différents et les exécute donc (dans l'ordre).
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];
}
}