簡體   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