使用 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
会生成更好的输出,但我的原始示例稍微好一点,编译器在此优化下不会对其进行优化。
constexpr
并不意味着"安排此函数在(正常(执行开始之前运行"。 特别是,常量表达式不能修改它未创建的对象(此处为任何Foo::_a
对象(。 但是,您可以创建一个返回array
的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();
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 将对象移动到std::shared_ptr
- C++11 中不同类型的对象的 std::array 的替代方案
- 使用 constexpr 初始化 std.array 中的对象
- std::array 在存储大型对象时是否仍然对缓存友好?
- 使用 std::array vs 数组传递对象数组
- 交换两个 std::array<T、100> 对象的成本是多少?
- 在对象实例化期间,是否可以定义std::array类成员的元素计数
- std::array 作为字段的语法是什么,里面的对象必须使用接受参数的 ctor 构造
- 如何初始化 std::array<std::array<T, 2>, 2> 的对象?
- 如何查找和替换Eigen::Array对象中的所有非有限数
- 检查 std::array 中的对象是否具有相同的成员数据
- 构造不可复制对象的"array"