【问题标题】:initializer_list constructor with default argument带默认参数的 initializer_list 构造函数
【发布时间】:2018-10-05 09:27:41
【问题描述】:

我在一个类中定义了一个初始化列表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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • “当我将 Box 类型的对象放入另一个类时,编译器会抱怨没有可用的默认 ctor。为什么?”
  • 它工作正常 - 您必须提供一个工作示例和最小的示例。
  • 我在 Visual Studio 2017 中使用 VIsualC++
猜你喜欢
  • 1970-01-01
  • 2011-07-18
  • 2014-07-09
  • 1970-01-01
  • 2016-06-05
  • 2010-12-10
  • 2022-01-26
  • 2012-06-30
  • 2016-01-06
相关资源
最近更新 更多