unique_ptrはコピー不可なのに、なぜ関数の戻り値の値渡しができるのか

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

unique_ptrはコピー不可なのに、なぜ関数の戻り値の値渡しができるのか

#1

投稿記事 by CMR » 7年前

コード:

#include <memory>
#include <iostream>

void main()
{
	auto created_num_ptr = std::make_unique<int>(365);
	auto num_ptr = created_num_ptr;
	std::cout << *num_ptr.get();
}
上記はコンパイルできないのに、

コード:

#include <memory>
#include <iostream>

std::unique_ptr<int> create()
{
	return std::make_unique<int>(365);
}

void main()
{
	auto num_ptr = create();
	std::cout << *num_ptr.get();
}
上記はコンパイルできます。
関数の戻り値はコピーされたオブジェクトが返されるのではないのでしょうか?
関数の戻り値渡しでのコピーではコピーコンストラクタは呼ばれないのでしょうか?

かずま

Re: unique_ptrはコピー不可なのに、なぜ関数の戻り値の値渡しができるのか

#2

投稿記事 by かずま » 7年前

unique_ptr は、copy はできないが move はできます。
関数の返却値は右辺値ですから、move コンストラクタが使われます。

created_num_ptr は左辺値なので、
auto num_ptr = std::move(created_num_ptr);
と明示的に move指定すればエラーになりません。

CMR

Re: unique_ptrはコピー不可なのに、なぜ関数の戻り値の値渡しができるのか

#3

投稿記事 by CMR » 7年前

右辺値の理解が深まりました。
ありがとうございました。

返信

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