首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++移动语义

C++移动语义
EN

Stack Overflow用户
提问于 2017-06-09 17:45:03
回答 2查看 209关注 0票数 3

我有这个例子:

代码语言:javascript
复制
Widget* makeWidget(int a, int b) {
if (a > b) {
    return new Widget(a);   
}
else {
    return new  Widget(b);  
 }
}

这不就像移动返回值一样,因为您只传递引用而不是副本吗?为什么我结束移动构造函数/赋值函数?

问候

EN

回答 2

Stack Overflow用户

发布于 2017-06-09 17:51:24

为什么结束移动构造函数/赋值函数?

在您的函数中:

代码语言:javascript
复制
Widget* makeWidget(int a, int b);

您返回的是一个Widget * (即:指向Widget的指针),这里根本不会发生对象移动。

不就像移动返回值一样,因为您只传递引用而不是副本吗?

它在语义上是不同的,因为通过移动你总是返回一个对象。

通过移动,您实际上不是在复制,而是将数据从移动对象(即:被移动的对象)移动到移动到对象(即:分别通过移动构造函数或移动赋值操作符构造或分配的对象)。

票数 1
EN

Stack Overflow用户

发布于 2017-06-09 17:51:32

这取决于你和它比较的是什么。如果您已经将返回类型替换为unique_ptr<Widget>,则可以使用move构造函数来实现清晰的所有权语义。

与普通的Widget返回相比,如果你这样做了,你也可以实现非空性。

在您的情况下,不执行任何移动,但您也没有任何好处。您返回的内容可以是空的,不需要指定所有权。在没有移动构造函数的情况下,你可以这样做,也可以被强制复制以维护正确的语义和保证。Move构造器允许你既吃蛋糕又吃蛋糕。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44454537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档