unique_ptr是不可复制部类,为什么能当函数的返回值
unique_ptr是不可复制类型,为什么能当函数的返回值?
这个代码gcc4.7, vc13都能编译通过。
我就奇怪了,既然说unique_ptr是不能拷贝的,那么我先不管有没有f函数的返回值优化,从语义上,返回的是一个拷贝出来的临时变量
那么返回去的这个对象,是一个拷贝的语义生成的啊,这个和unique_ptr是不可复制类型冲突吗?
------解决思路----------------------
记住指针不是拷贝指针,而是拷贝指向的地方
------解决思路----------------------
unique_ptr 不能 copy ,但是可以 move 。
------解决思路----------------------
std::move
------解决思路----------------------
返回的是个右值(准确地说是纯右值), 以前没右值引用时只能拷贝, 现在可以move了, 不过上面代码在gcc或者vc上应该连move都不会产生, 应该被优化掉了
------解决思路----------------------
C++ 11确实可以用move构造编译通过,即便没有move构造,还有一种潜规则即Named Return Value Optimization (具名返回值优化),这种情况下由于返回的时一个临时对象,所以编译器会将接受返回值的对象的引用传进去直接进行构造。
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是不可复制类型冲突吗?
------解决思路----------------------
记住指针不是拷贝指针,而是拷贝指向的地方
------解决思路----------------------
unique_ptr 不能 copy ,但是可以 move 。
------解决思路----------------------
std::move
------解决思路----------------------
返回的是个右值(准确地说是纯右值), 以前没右值引用时只能拷贝, 现在可以move了, 不过上面代码在gcc或者vc上应该连move都不会产生, 应该被优化掉了
------解决思路----------------------
C++ 11确实可以用move构造编译通过,即便没有move构造,还有一种潜规则即Named Return Value Optimization (具名返回值优化),这种情况下由于返回的时一个临时对象,所以编译器会将接受返回值的对象的引用传进去直接进行构造。