Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 获取要使用的移动构造函数/赋值运算符_C++_C++11_Move Semantics_Rvalue Reference - Fatal编程技术网

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
    B&
    和a
    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
被指定为第二个的副本。)