其中有class A
个const
成员。要编写其右值赋值运算符,我必须明确声明它。 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=;
};
答案 0 :(得分:4)
上述赋值运算符的正确语法是什么?
如果i
为const
,则无法分配,因此赋值运算符的实现应该只返回赋值运算符应该是隐含地留下*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中想要做什么。