C++ 获取要使用的移动构造函数/赋值运算符
考虑以下代码:C++ 获取要使用的移动构造函数/赋值运算符,c++,c++11,move-semantics,rvalue-reference,C++,C++11,Move Semantics,Rvalue Reference,考虑以下代码: #include <iostream> #define P_(x) std::cout << x << std::endl class B { public: B() { P_("B::B()"); } B(const B&) { P_("B::B(const B&)"); } B(B&&) { P_("B::B(B&&)"); } ~B() { P_("B::
#include <iostream>
#define P_(x) std::cout << x << std::endl
class B {
public:
B() { P_("B::B()"); }
B(const B&) { P_("B::B(const B&)"); }
B(B&&) { P_("B::B(B&&)"); }
~B() { P_("B::~B()"); }
B& operator=(const B&) { P_("B::op=(const B&)"); return *this; }
B& operator=(B&& b) { P_("B::op=(B&&)"); return *this; }
};
class Foo {
public:
void setB(const B& b) { mB = b; }
private:
B mB;
};
B genB() {
return B();
}
int main() {
Foo f;
f.setB(genB());
}
这清楚地表明,两个B被创建和销毁,但第二个是副本,而不是第一个的移动
尽可能使用移动构造函数的最佳方法是什么
- 我需要在某处调用std::move()吗
- a
和aB&
是否需要单独的重载B&
- 还有什么我完全不知道的吗
setB
功能:
class Foo {
public:
void setB(const B& b) { mB = b; }
void setB(B&& b) { mB = std::move(b); }
private:
B mB;
};
或者,您可以使用“按值传递”方式:
这里,参数
b
将在可能的情况下进行移动构造,或者以其他方式进行复制构造。您可以重载setB
功能:
class Foo {
public:
void setB(const B& b) { mB = b; }
void setB(B&& b) { mB = std::move(b); }
private:
B mB;
};
或者,您可以使用“按值传递”方式:
这里,参数
b
将在可能的情况下进行移动构造,或者以其他方式进行复制构造。第一个b
实例是在创建Foo
实例时创建的实例:
Foo f;
这是因为您的Foo
类有一个名为mB
的B
成员
第二个B
实例是由genB()
调用创建的实例
调用赋值运算符是因为您在Foo::setB
函数中执行赋值:
mB = b;
没有任何地方可以使用复制或移动构造函数。第一个
B
实例是在创建Foo
实例时创建的:
Foo f;
这是因为您的Foo
类有一个名为mB
的B
成员
第二个B
实例是由genB()
调用创建的实例
调用赋值运算符是因为您在Foo::setB
函数中执行赋值:
mB = b;
没有任何地方可以使用复制或移动构造函数。(实际上,第一个
B
被指定为第二个的副本。)(实际上,第一个B
被指定为第二个的副本。)