unique_ptr是不可复制类型,为什么能当函数的返回值?

gfdiutr 2015-10-29 08:27:31

unique_ptr<int> f(int i){
if (i == 0)
return unique_ptr<int>(new int(0));
else
return unique_ptr<int>(new int(1));
}
int main()
{
auto p = f(2);
return 0;
}

这个代码gcc4.7, vc13都能编译通过。
我就奇怪了,既然说unique_ptr是不能拷贝的,那么我先不管有没有f函数的返回值优化,从语义上,返回的是一个拷贝出来的临时变量
那么返回去的这个对象,是一个拷贝的语义生成的啊,这个和unique_ptr是不可复制类型冲突吗?
...全文
829 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdghchj 2015-10-30
  • 打赏
  • 举报
回复
C++ 11确实可以用move构造编译通过,即便没有move构造,还有一种潜规则即Named Return Value Optimization (具名返回值优化),这种情况下由于返回的时一个临时对象,所以编译器会将接受返回值的对象的引用传进去直接进行构造。
fly_dragon_fly 2015-10-30
  • 打赏
  • 举报
回复
返回的是个右值(准确地说是纯右值), 以前没右值引用时只能拷贝, 现在可以move了, 不过上面代码在gcc或者vc上应该连move都不会产生, 应该被优化掉了
mewiteor 2015-10-29
  • 打赏
  • 举报
回复
std::move
fefe82 2015-10-29
  • 打赏
  • 举报
回复
unique_ptr 不能 copy ,但是可以 move 。
yshuise 2015-10-29
  • 打赏
  • 举报
回复
记住指针不是拷贝指针,而是拷贝指向的地方

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧