具有const数据成员的类的std :: move和rvalue赋值运算符

时间:2014-08-13 20:06:22

标签: c++ c++11 move-semantics assignment-operator rvalue-reference

其中有class Aconst成员。要编写其右值赋值运算符,我必须明确声明它。 e.g。

struct A {
  const int i;
  // other members and constructors

  // A& operator= (A&&) = default; // This doesn't work due to `i`
  A& operator= (A&&);  // <--- what should be the body?
};

问题:1 ---上述赋值运算符

的正确语法是什么

问题:2 ---如果我们将它与模板一起使用,这是合法的方式吗?

template<class T>
struct move {
  T& operator= (T&& t);  // <--- same code here with `static_cast<T&>(*this)`
};

struct A : move<A> {
  const int i;
  // ...
  using move<A>::operator=;
};

2 个答案:

答案 0 :(得分:4)

  

上述赋值运算符的正确语法是什么?

如果iconst,则无法分配,因此赋值运算符的实现应该只返回*this 赋值运算符应该是隐含地留下delete&#39; ed。编译器生成的默认赋值运算符执行每个非静态数据成员的成员分配。对于无法分配的对象,无法做到这一点。 ,所以你最好的做法是用一个return语句来明确定义它。不允许你的课程从语言中移除它在语义上没有意义:

  

如果我们将它与模板一起使用,这是合法的方式吗?

是的,这是合法的。但是我没有看到这样做的理由,而不是在你的课堂上定义它。

您仍然需要构造函数来显式初始化i。除此之外,它确实允许移动分配,同时忽略const - i的{​​{1}} - 否则不允许这样做。

答案 1 :(得分:2)

身体将是:

A& A::operator= (A&& a)
{
    // code to move-assign other members

    return *this;
}

由于i是常量,因此无法在此函数中更新i

我不明白你在例子2中想要做什么。