12

抽象型への参照を初期化するとき、コンストラクタ初期化リストでの {} 初期化は () 初期化とどのように異なりますか? 以下のクラスバーを受講してください:

class AbstractBase
{
public:
    AbstractBase() {}
    virtual ~AbstractBase() = default;

    virtual void ab() = 0;
};

class Foo : public AbstractBase
{
public:
    Foo() {}

    void ab() {}
};

class Bar
{
public:
    Bar(const AbstractBase& base) : myBase{base} {}

private:
    const AbstractBase& myBase;
};


int main()
{
    Foo f{};
    Bar b{f};

}

コンパイルすると、エラーが発生します

test5.cpp: In constructor ‘Bar::Bar(const AbstractBase&)’:
test5.cpp:22:48: error: cannot allocate an object of abstract type ‘AbstractBase’
     Bar(const AbstractBase& base) : myBase{base}
                                                ^
test5.cpp:2:7: note:   because the following virtual functions are pure within ‘AbstractBase’:
 class AbstractBase
       ^
test5.cpp:8:18: note:   virtual void AbstractBase::ab()
     virtual void ab() = 0;

ラインの変更

Bar(const AbstractBase& base) : myBase(base) {}

コンパイルして正常に実行されます。

Stroustrup の C++11 の本を読んで、std::initializer_list<> を取るコンストラクターと他のコンストラクターの間にあいまいさがあった場合を除いて、{} はほとんどすべての場合 () と同じであるという印象を受けました。タイプとして auto を使用していますが、どちらもここでは行っていません。

4

1 に答える 1