我有几个代码行:
#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
无法解决此问题。
答案 0 :(得分:9)
虽然a
的类型是A
的右值引用,但a
本身是左值。要保留其右值,您需要使用std::move
:
B(A&& a) noexcept :
_a(std::move(a))
{}