I have this example:
Widget* makeWidget(int a, int b) {
if (a > b) {
return new Widget(a);
}
else {
return new Widget(b);
}
}
这不就相当于移动返回值吗,因为你只是传递了引用而不是副本?那我为什么要结束移动构造函数/赋值运算符呢?
问候
I have this example:
Widget* makeWidget(int a, int b) {
if (a > b) {
return new Widget(a);
}
else {
return new Widget(b);
}
}
这不就相当于移动返回值吗,因为你只是传递了引用而不是副本?那我为什么要结束移动构造函数/赋值运算符呢?
问候
为什么我需要定义移动构造函数/赋值运算符?
在你的函数中:
Widget* makeWidget(int a, int b);
这取决于你与什么进行比较。如果你将返回类型替换为unique_ptr<Widget>
,你需要使用移动构造函数来实现清晰的所有权语义。
与普通的Widget
返回相比,如果你这样做,你还可以实现非空性。
在你的情况下,没有进行任何移动,但你也没有任何好处。你返回的东西可能为空,没有所有权规定。没有移动构造函数,你要么这样做,要么被迫复制以保持正确的语义和保证。移动构造函数允许你拥有这个蛋糕,也能吃掉它。
std::move()
返回一个unique_ptr<Widget>
可能会抑制RVO。 - Walter::std::move()
,因为当一个值被返回时,自动进行到右值的转换。 - Ken Wayne VanderLinde
Widget* makeWidget(int a, int b) { return new Widget(a > b ? a : b); }
在C++中,?:
运算符甚至可以处理引用。也就是说,我甚至使用它来进行构造函数的条件调用(本身)以初始化实例。 - Scheff's Cat