如何强制调用移动构造函数(C ++)?

时间:2015-05-08 07:58:55

标签: c++ constructor move-semantics

我有几个代码行:

#include <iostream>

using namespace std;

class A
{
public:
  A() noexcept
  {
    cout << "A::A()" << endl;
  }
  A(const A&) noexcept
  {
    cout << "A::A(const A&)" << endl;
  }
  A(A&&) noexcept
  {
    cout << "A::A(A&&)" << endl;
  }
};

class B
{
public:

  B(const A& a) noexcept :
    _a(a)
  {}
  B(A&& a) noexcept :
    _a(a)
  {}

private:
  A _a;
};

int main(int argc, char* argv[])
{
  A a;
  B b1 = B(a);
  B b2 = B(A());
}

他们产生了这个输出:

A::A()
A::A(const A&)
A::A()
A::A(const A&)

我需要做什么才能从A::A(A&&)调用B::B(A&&)

正如您所看到的,添加noexcept无法解决此问题。

1 个答案:

答案 0 :(得分:9)

虽然a类型A的右值引用,但a本身是左值。要保留其右值,您需要使用std::move

B(A&& a) noexcept :
  _a(std::move(a))
{}