我试图在向量中移动元素,这是一个简化的例子
#include <iostream>
#include <vector>
struct A
{
A(size_t i) noexcept : i(i)
{ std::cout << "A-" << i << std::endl; }
A(A const& a) noexcept : i(a.i)
{ std::cout << "A copy" << std::endl; }
void operator=(A const& a) noexcept
{
i = std::move(a.i);
std::cout << "A op=" << std::endl;
}
A(A&& a) noexcept : i(std::move(a.i))
{ std::cout << "A move" << std::endl; }
~A() noexcept { }
int i;
};
int main()
{
// A a0(0);
// A a1 = std::move(a0);
std::vector<A> v;
v.reserve(2);
v.emplace_back( 0 );
v.emplace_back( 1 );
v.emplace_back( 2 );
v[0] = std::move( v[2] );
v[2] = std::move( A(3) );
return 0;
}
调整大小时向量调用移动;我不明白为什么v[0] = std::move( v[2] );
没有调用移动函数?
使用gcc版本4.7.2构建时的输出是
A-0
A-1
A-2
A move
A move
A op=
A-3
A op=
答案 0 :(得分:2)
您定义了一个移动构造函数,但没有定义移动分配。
A& operator = (A&&);
您的常规赋值运算符应返回引用:
A& operator=(A const& a)
{
std::cout << "A op=" << std::endl;
return *this;
}