Рассмотрим следующий код:
class Singleton
{
public:
static const Singleton& instance()
{
const static Singleton singleton;
return singleton;
}
private:
constexpr Singleton()
{
fillTable();
}
constexpr void fillTable()
{
uint64_t value = 0;
for (auto& element : table)
{
element = value;
value = value * 2 + 1;
}
}
// Копирование и перемещение запретили.
// ...
array<uint64_t, 1024> table;
};
Действительно ли такой код заполняет таблицу синглтона на этапе компиляции?
Если да, то что происходит при вызове конструктора? Ничего? То есть, таблица уже заполнена еще до вызова конструктора?
Вычисления на этапе компиляции будут гарантированы только в том случае, если:
вычисленное значение используется в качестве параметра шаблона (старый стиль)
вычисленное значение записывается в constexpr
-
переменную. В остальных случаях - как повезет.
По вашему коду сделать вывод невозможно.
constexpr-конструкторы
есть ограничения: все нестатические
члены класса должны быть инициализированы в списке
инициализатора конструктора(или при объявлении), точно также, как
и обычно инициализируются константные члены класса. Поэтому вы не
сможете вызвать constexpr_функцию в теле constexpr-конструктора для
инициализации члена table
.Выражение constexpr void fillTable()
означает, что функция ничего не возвращает, и это ничего является константным выражением. Одним словом constexpr_функция
должна возвращать значение, являющимся результатом любого константного выражения.
Надеюсь я смог помочь понять, почему gbg
прав в том, что
По вашему коду сделать вывод невозможно
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Здравствуйте мой проект maven имеет 3 модуля 1)ear 2)ejb 3)web Как внедрить EJB сессионный бин из ejb модуля в сервлет модуля web?