Ser*_*sak 4 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());
}
Run Code Online (Sandbox Code Playgroud)
他们产生这个输出:
A::A()
A::A(const A&)
A::A()
A::A(const A&)
Run Code Online (Sandbox Code Playgroud)
我需要做什么才能A::A(A&&)从中调用B::B(A&&)?
如您所见,添加noexcept无法解决此问题.
虽然类型的a是一个rvalue参照A,a本身是一个左值.要保持其rvalue-ness,您需要使用std::move:
B(A&& a) noexcept :
_a(std::move(a))
{}
Run Code Online (Sandbox Code Playgroud)