C++11 如何实现后缀增量运算符

C++11 如何实现后缀增量运算符,c++11,operator-overloading,rvalue-reference,C++11,Operator Overloading,Rvalue Reference,我学到了: 用户定义的后缀增量运算符应返回一个常量对象,使其行为类似于基本算术类型: int i = 0; i++ = 42; // error, i++ is pr-value ++i = 42; // ok, ++i is l-value 所以对于类Widget,它应该声明为 const Widget operator++(int); ... Widget w1, w2; w1++ = w2; // error, fine, same as i++ = 42 如果没有const,它将编译

我学到了: 用户定义的后缀增量运算符应返回一个常量对象,使其行为类似于基本算术类型:

int i = 0;
i++ = 42; // error, i++ is pr-value
++i = 42; // ok, ++i is l-value
所以对于类Widget,它应该声明为

const Widget operator++(int);
...
Widget w1, w2;
w1++ = w2; // error, fine, same as i++ = 42
如果没有const,它将编译。但有了这个,这是不可能的, 召唤

什么是pitty,因为w1++是一个r值表达式,它的constness没有影响,因为它是临时的,不是吗

现在,应该如何声明运算符++(int)? 感谢您的建议。

Widget operator++(int)是标准定义

声明按值返回但也返回常量的函数时,函数编写器试图限制函数使用者对函数的操作

就我个人而言,我从来没有这样做过,这只是一个不必要的约束,会导致与本例中所示完全相同的问题。但是其他人认为,为了得到编译器对
w1++=w2的诊断,不允许
f(w1++)
的“代价”是值得的这可能是一个逻辑错误。这实际上是一个观点和编码风格的问题。

Widget operator++(int)是标准定义

声明按值返回但也返回常量的函数时,函数编写器试图限制函数使用者对函数的操作

就我个人而言,我从来没有这样做过,这只是一个不必要的约束,会导致与本例中所示完全相同的问题。但是其他人认为,为了得到编译器对
w1++=w2的诊断,不允许
f(w1++)
的“代价”是值得的这可能是一个逻辑错误。这实际上是一个观点和编码风格的问题

用户定义的后缀增量运算符应返回一个常量对象,使其行为类似于基本算术类型:

int i = 0;
i++ = 42; // error, i++ is pr-value
++i = 42; // ok, ++i is l-value
在C++11中,通常不建议返回
const
-限定的类类型。正如您所注意到的,它阻止使用移动操作。要像基本算术类型一样工作,一种更简单的方法是禁用右值上的
=
运算符

struct S {
  S &operator=(const S &) & = default;
  S &operator=(S &&) & = default;
};
S f() { return {}; }
int main() {
  S s;
  s = s; // okay
  s = f(); // okay
  f() = s; // error
}
有了它,您可以声明
Widget operator++(int),拒绝
w1++=w2,但允许
f(w1++)

用户定义的后缀增量运算符应返回一个常量对象,使其行为类似于基本算术类型:

int i = 0;
i++ = 42; // error, i++ is pr-value
++i = 42; // ok, ++i is l-value
在C++11中,通常不建议返回
const
-限定的类类型。正如您所注意到的,它阻止使用移动操作。要像基本算术类型一样工作,一种更简单的方法是禁用右值上的
=
运算符

struct S {
  S &operator=(const S &) & = default;
  S &operator=(S &&) & = default;
};
S f() { return {}; }
int main() {
  S s;
  s = s; // okay
  s = f(); // okay
  f() = s; // error
}

有了它,您可以声明
Widget operator++(int),拒绝
w1++=w2,但允许
f(w1++)

这是应该如何声明这些运算符这是应该如何声明这些运算符