【问题标题】:moving elements in an vector [duplicate]移动向量中的元素[重复]
【发布时间】:2013-04-01 11:40:18
【问题描述】:

我正在尝试移动向量中的元素,这是一个简化的示例

#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=

【问题讨论】:

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


    【解决方案1】:

    您定义了一个移动构造函数,但没有定义移动赋值。

    A& operator = (A&&);
    

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

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

    【讨论】:

    • 谢谢。我可以在 7 分钟后接受你的回答。我应该知道 std::move 正在返回一个 A&amp;&amp; 而我没有定义 operator=(A&amp;&amp;) 函数。
    猜你喜欢
    • 2016-09-01
    • 2018-09-30
    • 2014-11-21
    • 2017-01-30
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    相关资源
    最近更新 更多