用载体建立在苍蝇递归结构上

constructing on the fly recursive structure with vector

本文关键字:苍蝇 递归 结构上 建立      更新时间:2023-10-16

我想知道为什么以下代码对编译器是错误的:

struct foo {
    int a;
    vector<foo> b;
};
int main() {
    foo c = foo{1, vector<foo>{1, vector<foo>{1}}};
}

虽然它与此汇编:

foo c = foo{1, vector<foo>{1}};

是因为不支持这种嵌套结构构造或我做错了吗?

使用Boost递归包装器:

#include <boost/variant/recursive_wrapper.hpp>
struct foo;
struct foo {
    int a;
    vector<boost::recursive_wrapper<foo>> b;
};

如果您不想使用Boost或滚动自己的包装器,
考虑内部使用指针。

您犯了小错误,当然可以使用,但是您需要使用正确的vector构造函数。

这将在内部使用1个对象(使用自动生成的默认构造函数初始化)创建FOO的向量:

auto v = vector<foo>{1u};

您可以列出对象,您可以明确创建:

auto x = foo{3, vector<foo>{ foo{1, vector<foo>{1u}},
                             foo{2, vector<foo>{1u}} }};

将不完整的类型传递给std::vector实际上是非法的。确实没有很好的理由是非法的,但是标准是这样说的。

如果您输入:

您的代码将编译并工作
foo c = foo{1, vector<foo>{{1, vector<foo>{1}}}};

注意额外的{}集。但这不会符合标准,至少在C 11中。

有几种类型,例如std::unique_ptr。您可以合法地进行vector<unique_ptr<Foo>>

foo c = {1, {std::make_unique<Foo>( 1 )}};

请注意,make_unique在其中不太支持基于{}的结构。使用移动CTOR作品:

foo c = {1, {std::make_unique<Foo>( Foo{1, {}} )}};