ページ 11

emplace_back()について

Posted: 2018年8月05日(日) 17:30
by nanobird
初めまして。最近c++を学び始めた者です。

https://dixq.net/rp2/15.html

こちらのページについて質問です。

コード:

//EnemyManager.h
class EnemyManager : public Task
{
private:
    std::list<std::shared_ptr<Enemy>> _list;
};

コード:

//EnemyManager.cpp

EnemyManager::EnemyManager()
{
    _list.emplace_back(make_shared<Enemy>(Define::CENTER_X, 100));
}
ここでemplace_back()が使われていますが、まずemplace_back()にはそのリストの型(std::shared_ptr<Enemy>)のコンストラクタ引数を渡すものという理解であっていますか?
また、そうだとしたら、make_shared<Enemy>(Define::CENTER_X, 100)はstd::shared_ptr<Enemy>のオブジェクトを戻り値として返すため、emplace_back()に渡すものがコンストラクタ引数ではなくオブジェクトになってしまうため、これはemplace_back()ではなくpush_back()なのではないかと思ってしまいます。
どなたか私がどこが間違っているのかの指摘をお願いいたします。

Re: emplace_back()について

Posted: 2018年8月06日(月) 18:30
by a5ua
まずemplace_back()にはそのリストの型(std::shared_ptr<Enemy>)のコンストラクタ引数を渡すものという理解であっていますか?
その理解で合っています。

一口にコンストラクタと言っても、以下に示すように複数のコンストラクタが定義されています。
https://cpprefjp.github.io/reference/me ... uctor.html

今回のケースでは、std::shared_ptr<Enemy>のムーブコンストラクタ(上記リンクの(10))が呼ばれ、
emplace_back()の動作的としては、push_back()を呼び出したときと同等になると思われます。

Re: emplace_back()について

Posted: 2018年8月06日(月) 23:48
by nanobird
そういうことだったのですね。ありがとうございます。