【发布时间】: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 中没有
【问题讨论】:
-
作为minimal reproducible example,这似乎工作正常:Live Demo on coliru。 (我知道 VS2013 和初始化列表...... - 坏故事。)
-
@Scheff 如果您在 Other 的 ctor 的初始化列表中删除对 Box 的默认 ctor 的显式调用会怎样?
-
我以前试过(现在又试了一次)。它也可以编译。但它是
g++ 8.1.0和-std=c++14。 Live Demo on coliru -
我也无法重现...coliru.stacked-crooked.com/a/ffe46d5001b04650 ...确切的错误消息是什么,它发生在哪里?发布mcve。这现在只是一个猜谜游戏......
-
我在 Godbolt 上再次尝试(我可以选择 MSVC):Live Demo on godbolt.
标签: c++ constructor initializer-list default-arguments