使用constexpr初始化std.array中的对象

问题描述 投票:0回答:1

我有一个名为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将产生更好的输出,但是我的原始示例稍好一些,并且编译器没有在此优化下对其进行优化。

c++ c++17 constexpr
1个回答
0
投票

constexpr并不意味着“安排此功能在(正常)执行开始之前运行”。特别是,常量表达式无法修改它未创建的对象(此处为Foo::_a对象中的任何一个)。但是,您可以创建一个constexpr函数,该函数returns一个array并将其用作initializer

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

Foos foos=iota_foos();
© www.soinside.com 2019 - 2024. All rights reserved.