如何强制调用移动构造函数(C++)?
How to enforce a calling of a moving constructor (C++)?
我有这几行代码:
#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&)
我需要做什么才能从 B::B(A&&)
调用 A::A(A&&)
?
如您所见,添加 noexcept
并未解决此问题。
虽然 a
的 type 是对 A
的右值引用,但 a
本身是左值。要保留其右值性,您需要使用 std::move
:
B(A&& a) noexcept :
_a(std::move(a))
{}
我有这几行代码:
#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&)
我需要做什么才能从 B::B(A&&)
调用 A::A(A&&)
?
如您所见,添加 noexcept
并未解决此问题。
虽然 a
的 type 是对 A
的右值引用,但 a
本身是左值。要保留其右值性,您需要使用 std::move
:
B(A&& a) noexcept :
_a(std::move(a))
{}