在C ++中为包含引用的类移动赋值/构造

时间:2016-08-18 19:25:08

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

考虑

 class A
  {
    array<double, 10> array;
    double &a5;

    public:
      A():a5(array.at(5))
      {}

  };

感觉此类上的移动赋值或移动构造函数会使成员a5无效。那是对的吗?有解决方法吗?

1 个答案:

答案 0 :(得分:2)

为了避免a5变为无效的可能性,请实现自己的移动构造函数/赋值来复制/移动数组内容但不要更改a5,例如:

class A
{
    std::array<double, 10> arr;
    double &a5;

    A()
      : a5(arr[5])
    {}

    A(const A& src)
      : arr(src.arr), a5(arr[5])
    {}

    A(A&& src)
      : arr(std::move(src.arr)), a5(arr[5])
    {}

    A& operator=(const A& rhs)
    {
        if (this != &rhs)
            arr = src.arr;
        return *this;
    }

    A& operator=(A&& rhs)
    {
        std:swap(arr, src.arr);
        return *this;
    }
};