The trick is to put the code into an immediately-invoked lambda. Then it doesn't matter if you use std::generate
or a plain loop:
constexpr std::array<int,100> a = []{ std::array<int,100> ret{}; std::generate(ret.begin(), ret.end(), [n=0]() mutable {return n += 3;}); return ret;}();
constexpr std::array<int,100> a = []{ td::array<int,100> ret{}; for (std::size_t i = 0; i < ret.size(); i++) ret[i] = 3 * (1+i); return ret;}();