You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++03中使用初始化列表初始化数组成员?

C03替代C11数组成员初始化方案

以下代码在C11中可正常编译运行,但在C03中会报错:

struct Foo {
    int a, b;
    Foo(int a, int b) : a(a), b(b) {}
};

struct Bar {
    Foo foos[2];
    Bar(int i) :
        foos{ {i + 1, i + 2}, {i + 2, i + 3} },
    {}
};

int main() {}

问题:有没有适用于C++03的替代实现?我需要通过Bar的构造参数来初始化数组中的Foo成员,之前见过类似问题但没解决我的场景。


可行的C++03实现方案

C03不支持C11的列表初始化语法,也没法在构造函数初始化列表中直接调用数组元素的带参构造函数,这里提供几种适配方案:

方案1:借助placement new手动构造数组元素

如果不能修改Foo的定义(比如无法添加默认构造函数),可以用placement new直接在预留内存上构造Foo对象:

#include <new> // 必须包含此头文件

struct Foo {
    int a, b;
    Foo(int a, int b) : a(a), b(b) {}
};

struct Bar {
    // 预留足够存储两个Foo对象的内存空间
    char _foos_buf[sizeof(Foo) * 2];
    Foo* foos;

    Bar(int i) {
        foos = reinterpret_cast<Foo*>(_foos_buf);
        // 手动调用Foo的带参构造函数初始化每个元素
        new (foos) Foo(i + 1, i + 2);
        new (foos + 1) Foo(i + 2, i + 3);
    }

    // 手动调用析构函数清理资源
    ~Bar() {
        foos[1].~Foo();
        foos[0].~Foo();
    }
};

int main() {}

方案2:给Foo添加默认构造函数后赋值

如果允许修改Foo的定义,添加一个无参默认构造函数,就可以在Bar的构造函数体内直接赋值:

struct Foo {
    int a, b;
    Foo() {} // 添加无参默认构造函数
    Foo(int a, int b) : a(a), b(b) {}
};

struct Bar {
    Foo foos[2];
    Bar(int i) {
        foos[0] = Foo(i + 1, i + 2);
        foos[1] = Foo(i + 2, i + 3);
    }
};

int main() {}

方案3:用静态辅助函数生成初始化后的数组容器

如果不想用placement new,也可以用临时结构体包裹数组,通过静态函数初始化后赋值:

struct Foo {
    int a, b;
    Foo(int a, int b) : a(a), b(b) {}
};

struct Bar {
    Foo foos[2];

    // 静态辅助函数:根据参数生成初始化好的Foo数组
    static struct FooArray {
        Foo arr[2];
    } make_foos(int i) {
        FooArray temp;
        // 依赖Foo的默认拷贝构造函数(编译器会自动生成)
        temp.arr[0] = Foo(i + 1, i + 2);
        temp.arr[1] = Foo(i + 2, i + 3);
        return temp;
    }

    Bar(int i) {
        FooArray temp = make_foos(i);
        foos[0] = temp.arr[0];
        foos[1] = temp.arr[1];
    }
};

int main() {}

内容的提问来源于stack exchange,提问作者nowox

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:42:39