Рассмотрим следующий код:
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 прав в том, что
По вашему коду сделать вывод невозможно
Сборка персонального компьютера от Artline: умный выбор для современных пользователей