具有默认参数的initializer_list构造函数

时间:2018-10-05 09:27:41

标签: c++ constructor initializer-list default-arguments

我在一个类中定义了一个初始化列表ctor(序列ctor),并给它一个默认参数,如下所示:

class Box 
{
public:
    Box(std::initializer_list<XMFLOAT3> vertices = {XMFLOAT3(), XMFLOAT3(), XMFLOAT3(), XMFLOAT3(), XMFLOAT3(), XMFLOAT3(), XMFLOAT3(), XMFLOAT3()});
    ~Box();
    void SetVertices(std::initializer_list<XMFLOAT3> vertices);
    XMFLOAT3 (&GetVertices())[8];
    Mesh &GetMesh() { return mMesh; }
private:
    XMFLOAT3 mVertices[8];
    Mesh mMesh;
};

但是当我将Box类型的对象放在另一个类中时,编译器会抱怨没有可用的默认ctor。为什么?

编辑 如果我将默认ctor调用到包含类ctor的初始化列表中:

Bone::Bone(std::string const &name) : mName(name), mCollisionBox{}
{
}

(我知道当存在initializer_list ctor时,花括号符号会首先调用默认ctor,而不是带有空列表的initializer_list ctor) 它会调用默认的ctor。

如果我明确调用默认的ctor,也会调用它:

Bone::Bone(std::string const &name) : mName(name), mCollisionBox()
{
}

我在Visual Studio 2017中使用VisualC ++ 真的很奇怪。

编辑2

在此示例中它有效,但是正如我在注释行中指出的那样,它在VS 2017中不可用

http://coliru.stacked-crooked.com/a/e1de3b215c6c4634

1 个答案:

答案 0 :(得分:-1)

您问的是错误的问题-因为您的要求完全合法。可能是错误造成的,或者您需要提供一个最小而完整的示例。