Использование constexpr для инициализации объектов в std.array - PullRequest
0 голосов
/ 18 октября 2019

У меня есть массив с именем foos с экземплярами Foo. Они хранятся в std.array, и я хотел бы инициализировать их во время компиляции. Возможно ли это с помощью C++17 и constexpr?

struct Foo
{
    constexpr void setA(int a);
    int _a{0};
};

static std::array<Foo, 100> foos;

static constexpr void initialize()
{
    int i = 0;
    for (auto& e : foos)
    {
        e.setA(i++);
    }
}

Кажется, инициализация все еще выполняется во время выполнения. Я что-то упустил?

https://gcc.godbolt.org/z/r4WUbE

Я знаю, что -O3 будет генерировать лучший вывод, но мой оригинальный пример немного лучше, и компилятор не оптимизирует его при этой оптимизации.

1 Ответ

1 голос
/ 18 октября 2019

constexpr не означает «запланировать выполнение этой функции до начала (нормального) выполнения». В частности, константное выражение не может изменить объект (здесь, любой из Foo::_a объектов), который он не создал. Однако вы можете сделать функцию constexpr, которая возвращает array, и использовать ее в качестве инициализатора :

using Foos=std::array<Foo,100>;
constexpr Foos iota_foos() {
  Foos ret;
  int i=0;
  for(auto &f : ret) f.setA(i++);
  return ret;
}

static Foos foos=iota_foos();
...