繁体   English   中英

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

[英]Using constexpr to initialize objects in std.array

我有一个名为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会生成更好的output,但是我原来的例子稍微好一点,编译器在这个优化下没有优化它。

constexpr并不意味着“安排此 function 在(正常)执行开始之前运行”。 特别是,常量表达式不能修改不是它创建的 object(这里是任何Foo::_a对象)。 但是,您可以创建一个constexpr function返回一个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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM