Инициализация константой
Задаёт начальные значения статических переменных константой времени компиляции.
Пояснение
Инициализация константой выполняется в следующих случаях:
| (до C++11) |
|
(начиная с C++11) (до C++17) |
|
(начиная с C++17) (до C++20) |
| (начиная с C++20) |
Эффекты инициализации константой совпадают с эффектами соответствующей инициализации, за исключением того, что гарантируется её завершение до начала любой другой инициализации статического или локального для потока(начиная с C++11) объекта.
Примечания
Компилятору разрешается инициализировать другие статические и локальные для потока(начиная с C++11) объекты константой, если он может гарантировать, что значение будет таким же, как при соблюдении стандартного порядка инициализации.
Инициализация константой обычно происходит при загрузке программы в память, в рамках инициализации среды выполнения программы.
Пример
#include <iostream>
#include <array>
struct S
{
static const int c;
};
const int d = 10 * S::c; // not a constant expression: S::c has no preceding
// initializer, this initialization happens after const
const int S::c = 5; // constant initialization, guaranteed to happen first
int main()
{
std::cout << "d = " << d << '\n';
std::array<int, S::c> a1; // OK: S::c is a constant expression
// std::array<int, d> a2; // error: d is not a constant expression
}
Вывод:
d = 50
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение согласно опубликованной версии | Корректное поведение |
|---|---|---|---|
| CWG 441 | C++98 | ссылки нельзя было инициализировать константой | такая инициализация стала возможна |
| CWG 1489 | C++11 | было неясно, может ли инициализация объекта значением быть инициализацией константой | может |
| CWG 1747 | C++11 | привязка ссылки к функции не могла быть инициализацией константой | может |
| CWG 1834 | C++11 | привязка ссылки к xvalue не могла быть инициализацией константой | может |
См. также
constinitconstexpr- конструктор
- преобразующий конструктор
- конструктор копирования
- конструктор по умолчанию
explicit- инициализация
- перемещающий конструктор
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/constant_initialization