C++, constexpr и инициализатор синглтона

70
17 февраля 2022, 12:20

Рассмотрим следующий код:

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;
};

Действительно ли такой код заполняет таблицу синглтона на этапе компиляции?

Если да, то что происходит при вызове конструктора? Ничего? То есть, таблица уже заполнена еще до вызова конструктора?

Answer 1

Вычисления на этапе компиляции будут гарантированы только в том случае, если:

  1. вычисленное значение используется в качестве параметра шаблона (старый стиль)

  2. вычисленное значение записывается в constexpr - переменную. В остальных случаях - как повезет.

По вашему коду сделать вывод невозможно.

Answer 2
  1. На constexpr-конструкторы есть ограничения: все нестатические члены класса должны быть инициализированы в списке инициализатора конструктора(или при объявлении), точно также, как и обычно инициализируются константные члены класса. Поэтому вы не сможете вызвать constexpr_функцию в теле constexpr-конструктора для инициализации члена table.
  2. Вы имеете возможность создать всего один экземпляр класса_одиночки посредством вызова статического члена, который возвращает статический обьект, поэтому смысла нет содержать нестатический член в этом классе.

Выражение constexpr void fillTable() означает, что функция ничего не возвращает, и это ничего является константным выражением. Одним словом constexpr_функция должна возвращать значение, являющимся результатом любого константного выражения. Надеюсь я смог помочь понять, почему gbg прав в том, что

По вашему коду сделать вывод невозможно

READ ALSO
Связывание таблиц

Связывание таблиц

Есть таблица:

80
Почему странно работает OR? MySql

Почему странно работает OR? MySql

Запрос составлен следующим образом:

132
Log4j2: не пишет логи в файл

Log4j2: не пишет логи в файл

Я подключил Log4j2

105
Внедрение EJB в Сервлет java

Внедрение EJB в Сервлет java

Здравствуйте мой проект maven имеет 3 модуля 1)ear 2)ejb 3)web Как внедрить EJB сессионный бин из ejb модуля в сервлет модуля web?

95