没有默认构造函数的C++成员数组初始化

13

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

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

class TwoThings
{
    public:

    Thing things[2];

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

这是正确的方式吗?

GCC可以成功编译它,而Clang则不能,并且指出应该使用“初始化列表”。我尝试了几种替代方法,如双括号{{ ... }}等,但无法找到与Clang编译等效的解决方案。

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

1个回答

14

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


是的,用括号括起来的成员数组初始化是GCC的扩展。如果要使其符合标准,可以使用单一的一对大括号(需要C++11):
TwoThings() : things{Thing("thing 1"),Thing("thing 2")}
{
}

如果你不能使用C++11,你可以考虑使用其他的存储方法,比如std::pair<Thing,Thing>或者std::vector<Thing>


那么,如果没有这些扩展或C++11(会破坏我的许多旧库),就没有初始化数组的方法了吗? - dronus
1
你可以使用不同的存储方法,比如 std::pair<Thing,Thing> 或者 std::vector<Thing> - TartanLlama
我猜std::vector也需要具有默认构造函数的元素? - dronus
不,你可以使用reservepush_back来代替使用resize,以防止默认构造任何内容。 - TartanLlama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接