emplace_back()について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
nanobird

emplace_back()について

#1

投稿記事 by nanobird » 2ヶ月前

初めまして。最近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()なのではないかと思ってしまいます。
どなたか私がどこが間違っているのかの指摘をお願いいたします。

アバター
a5ua
記事: 199
登録日時: 8年前

Re: emplace_back()について

#2

投稿記事 by a5ua » 2ヶ月前

まずemplace_back()にはそのリストの型(std::shared_ptr<Enemy>)のコンストラクタ引数を渡すものという理解であっていますか?
その理解で合っています。

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

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

nanobird
記事: 5
登録日時: 2ヶ月前

Re: emplace_back()について

#3

投稿記事 by nanobird » 2ヶ月前

そういうことだったのですね。ありがとうございます。

返信

“C言語何でも質問掲示板” へ戻る