gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:07:35 26 4
gpt4 key购买 nike

我有一个名为 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 对象)。但是,您可以创建一个 constexpr 函数,该函数返回一个数组,并将其用作初始化器:

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

关于c++ - 使用 constexpr 初始化 std.array 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58442648/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com