ページ 11

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

Posted: 2017年11月23日(木) 14:53
by CMR

コード:

#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はコピー不可なのに、なぜ関数の戻り値の値渡しができるのか

Posted: 2017年11月23日(木) 15:36
by かずま
unique_ptr は、copy はできないが move はできます。
関数の返却値は右辺値ですから、move コンストラクタが使われます。

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

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

Posted: 2017年11月23日(木) 15:59
by CMR
右辺値の理解が深まりました。
ありがとうございました。