C++
Ключевые слова с переменной переменной
Поиск…
Const
Спецификатор типа; когда применяется к типу, выдает версию типа const. См. Ключевое слово const для получения подробной информации о значении 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
Устанавливает тип своего операнда, который не оценивается.
Если операнд
e
является именем без каких-либо дополнительных круглых скобок, тоdecltype(e)
является объявленным типомe
.int x = 42; std::vector<decltype(x)> v(100, x); // v is a vector<int>
Если операндом
e
является доступ к члену класса без каких-либо дополнительных круглых скобок, тогдаdecltype(e)
является объявленным типом доступного элемента.struct S { int x = 42; }; const S s; decltype(s.x) y; // y has type int, even though s.x is const
Во всех других случаях
decltype(e)
дает как тип, так и категорию значений выраженияe
следующим образом:- Если
e
является l значением типаT
, тоdecltype(e)
естьT&
. - Если
e
- значение x типаT
, тоdecltype(e)
-T&&
. - Если
e
является prvalue типаT
, тоdecltype(e)
естьT
Это включает случай с посторонними скобками.
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
- Если
Специальная форма decltype(auto)
выводит тип переменной из ее инициализатора или возвращаемого типа функции из операторов return
в ее определении, используя правила вывода типа decltype
а не 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
подписанный
Ключевое слово, которое является частью некоторых имен целых типов.
- При использовании в одиночку подразумевается
int
, так чтоsigned
,signed int
иint
имеют один и тот же тип. - В сочетании с
char
выдает типsigned char
, который отличается отchar
, даже еслиchar
также подписан.signed char
имеет диапазон, который включает, по меньшей мере, от -127 до +127 включительно. - В сочетании с
short
,long
илиlong long
, он избыточен, поскольку эти типы уже подписаны. -
signed
не может быть объединен сbool
,wchar_t
,char16_t
илиchar32_t
.
Пример:
signed char celsius_temperature;
std::cin >> celsius_temperature;
if (celsius_temperature < -35) {
std::cout << "cold day, eh?\n";
}
неподписанный
Спецификатор типа, который запрашивает неподписанную версию целочисленного типа.
- При использовании в одиночку подразумевается
int
, поэтомуunsigned
имеет тот же тип, что иunsigned int
. - Тип
unsigned char
отличается отchar
типа, даже еслиchar
без знака. Он может содержать целые числа не менее 255. -
unsigned
также может сочетаться сshort
,long
илиlong long
. Его нельзя комбинировать сbool
,wchar_t
,char16_t
илиchar32_t
.
Пример:
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
}
летучий
Тип классификатора; когда применяется к типу, создается версия с изменчивой квалификацией. Неустойчивая квалификация играет ту же роль, что и const
квалификация в системе типов, но volatile
не препятствует модификации объектов; вместо этого он вынуждает компилятор обрабатывать все обращения к таким объектам, как побочные эффекты.
В приведенном ниже примере, если memory_mapped_port
не был volatile, компилятор мог оптимизировать функцию так, чтобы она выполняла только окончательную запись, которая была бы неправильной, если sizeof(int)
больше 1. volatile
квалификация заставляет ее обрабатывать все sizeof(int)
записывается как разные побочные эффекты и, следовательно, выполняет все их (в порядке).
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];
}
}