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

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: unique_ptrはコピー不可なのに、なぜ関数の戻り値の値渡しができるのか

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

#3

by CMR » 7年前

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

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

#2

by かずま » 7年前

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

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

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();
}
上記はコンパイルできます。
関数の戻り値はコピーされたオブジェクトが返されるのではないのでしょうか?
関数の戻り値渡しでのコピーではコピーコンストラクタは呼ばれないのでしょうか?

ページトップ