c++ - move vector 中的元素

标签 c++ c++11 move-semantics

<分区>

我正在尝试 move vector 中的元素,这是一个简化的示例

#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;
}

vector 在调整大小时调用 move ;我不明白为什么 v[0] = std::move( v[2] ); 不调用 move 函数?

我使用 gcc 4.7.2 版构建时的输出是

A-0
A-1
A-2
A move
A move
A op=
A-3
A op=

最佳答案

您定义了 move 构造函数,但没有定义 move 赋值。

A& operator = (A&&);

并且您的常规赋值运算符应该返回一个引用:

A& operator=(A const& a) 
{
    std::cout << "A op=" << std::endl;
    return *this;
}

关于c++ - move vector 中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15737144/

相关文章:

c++ - cmake 和 GenerateExportHeader

c++ - 在 ofstream 写入期间检测到空间不足,stream.fail() 无法工作

c++ - 如何访问成员变量sqlite回调

c++ - C++:有关使用Stroustrup示例的移动构造函数/赋值的问题

c++ - 在实践中何时调用 move 构造函数?

c++ - 使用 `Node*` 作为列表的迭代器

C++11 : How can I define a function that accept a universal reference of a specific type of object?

C++:在不复制/move 太多的情况下解压缩具有引用和值的元组

c++ - 我可以将 std::map 的内容 move 分配到另一个 std::map 吗?

c++ - move 构造函数和 `std::array`