ページ 11

[c++]std::make_uniqueを関数の引数に

Posted: 2017年5月09日(火) 23:51
by purin52002
こんばんは
最近はue4をいじっていましたが、ようやくc++のコードを書けそうです。

今回の質問ですが、以下のコードをご覧ください。

コード:

class Super ;
class Sub : public Super ;

void Func(std::unique_ptr<Super>&& x) ; //Superクラスのポインタを引数にとる関数

int main()
{
    //error
    //引数の型が合わないと怒られる(unique_ptr<Sub>が作られるから?)
    Func(std::make_unique<Sub>() ) ;
}

上のコードのように、make_uniqueを関数の引数に渡したいのですが、引数の型が合わないと怒られてしまいます。
対策としてunique_ptr<Super>の変数にmake_uniqueの結果を代入し、それを引数に渡しているのですが、できることなら引数にmake_uniqueを渡してしまいたいです。

なにかいい方法はないでしょうか?

Re: [c++]std::make_uniqueを関数の引数に

Posted: 2017年5月10日(水) 14:48
by sleep
purin52002 さんが書きました:

コード:

class Super ;
class Sub : public Super ;

void Func(std::unique_ptr<Super>&& x) ; //Superクラスのポインタを引数にとる関数

int main()
{
    //error
    //引数の型が合わないと怒られる(unique_ptr<Sub>が作られるから?)
    Func(std::make_unique<Sub>() ) ;
}

上のコードのように、make_uniqueを関数の引数に渡したいのですが、引数の型が合わないと怒られてしまいます。

コード:

void Func(std::unique_ptr<Super>& u_ptr);
のように、実際にコンパイルしているコードの仮引数が & ということは無いですか?

lvalue だとエラーが出なくて、rvalue だとエラーが出るというところが不可解です。(エラーが発生しているのは本当にそこですか?どちらも受け取れるはずです)

実際にエラーが出るコンパイル可能な最小限のコードを掲示した方が良いでしょう。

Re: [c++]std::make_uniqueを関数の引数に

Posted: 2017年5月10日(水) 14:55
by sleep
sleep さんが書きました: lvalue だとエラーが出なくて、rvalue だとエラーが出るというところが不可解です。(エラーが発生しているのは本当にそこですか?どちらも受け取れるはずです)
上記は lvalue が受け取れるなら、の意ですが、
それもおかしな話で、掲示されているコードでは逆に lvalueは 受け取れず、エラーが出るはずなのですが・・・

Re: [c++]std::make_uniqueを関数の引数に

Posted: 2017年5月10日(水) 15:09
by purin52002
すみません、提示コードが間違いです^^;

本当は右辺値ではなく左辺値を受け取る関数です。

私の理解だと、左辺値は実体が作られたもの、右辺値は関数の返り値など直前に作られたものだと思っています。

私が今作っている関数ではどちらの場合でもエラーが出ないようにしたいと思っています。


、、、ここまで書いて気づいてしまったのですが、左辺値を引数にする関数と右辺値を引数にする関数を作ってオーバーロードすれば解決ですかね?

Re: [c++]std::make_uniqueを関数の引数に

Posted: 2017年5月10日(水) 15:13
by purin52002
お騒がせして申し訳ありません<(__)>

オーバーロードでおそらく解決しました^^;