【问题标题】:C++ member array initalisation without default constructors没有默认构造函数的 C++ 成员数组初始化
【发布时间】:2015-04-20 09:16:43
【问题描述】:

我有一个类Thing 没有默认构造函数。

现在我们定义另一个类,它现在必须立即初始化数组元素,因为没有默认构造函数,就不能进行后期赋值。所以我们有:

class TwoThings
{
    public:

    Thing things[2];

    TwoThings() : things({Thing("thing 1"),Thing("thing 2")})
    {
    }
}

这是正确的方法吗?

GCC 可以很好地编译它,而 Clang 没有,说明应该使用“初始化列表”。我尝试了几种替代方法,例如双括号 {{ ... }} 等,但无法获得 Clang 的编译等效项。

如何在 Clang 中初始化没有默认构造函数的数组?

【问题讨论】:

    标签: c++ clang array-initialization


    【解决方案1】:

    是的,带括号的成员数组初始化是 GCC 扩展。为了使其成为标准,您可以只使用一组大括号(需要 C++11):

    TwoThings() : things{Thing("thing 1"),Thing("thing 2")}
    {
    }
    

    如果您不能使用 C++11,则可能需要使用不同的存储方法,例如 std::pair<Thing,Thing>std::vector<Thing>

    【讨论】:

    • 那么没有这些扩展或 C++11(破坏了我的许多旧库)就无法初始化数组?
    • 您可以使用不同的存储方法,例如std::pair<Thing,Thing>std::vector<Thing>
    • 我猜std::vector 也需要具有默认构造函数的元素?
    • 不,您可以使用reservepush_back 而不是使用resize 来阻止它默认构造任何东西。
    猜你喜欢
    • 2021-05-28
    • 2015-10-07
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2021-12-16
    相关资源
    最近更新 更多