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

Using constexpr to initialize objects in std.array

本文关键字:对象 array std constexpr 初始化 使用      更新时间:2023-10-16

我有一个名为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会生成更好的输出,但我的原始示例稍微好一点,编译器在此优化下不会对其进行优化。

constexpr并不意味着"安排此函数在(正常(执行开始之前运行"。 特别是,常量表达式不能修改它未创建的对象(此处为任何Foo::_a对象(。 但是,您可以创建一个返回arrayconstexpr函数,并将其用作初始值设定项

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();