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++)代码>这是应该如何声明这些运算符这是应该如何声明这些运算符