C++ 后增量返回值

C++ 后增量返回值,c++,c++14,C++,C++14,我已经看到了一些关于后增量运算符正确声明的答案 T operator++(int); 大多数选择返回值。“Exception C++”建议返回常量值,以防止将结果用作l值 Postincrement应该返回一个常量值,在本例中为const Complex。通过不允许对返回的对象进行更改,我们可以防止像a++++这样的有问题的代码,这与天真的用户可能认为的不一样。” 快速搜索发现了这种反应——如果我理解正确的话,现在添加const将阻止使用返回值作为移动语义的参数。因此,移动操作的介绍否定了19

我已经看到了一些关于后增量运算符正确声明的答案

T operator++(int);
大多数选择返回值。“Exception C++”建议返回常量值,以防止将结果用作l值

Postincrement应该返回一个常量值,在本例中为const Complex。通过不允许对返回的对象进行更改,我们可以防止像
a++++
这样的有问题的代码,这与天真的用户可能认为的不一样。”

快速搜索发现了这种反应——如果我理解正确的话,现在添加const将阻止使用返回值作为移动语义的参数。因此,移动操作的介绍否定了1999年书中的建议


问题是-实现C++14中“Exception C++”推荐的相同结果的正确方法是什么?

您可以禁止右值的后期增量:

T operator++(int) && = delete;
您必须使用
限定原始重载:

T operator++(int) & { /*...*/ }.

您可以禁止右值的后期增量:

T operator++(int) && = delete;
您必须使用
限定原始重载:

T operator++(int) & { /*...*/ }.


我的建议是返回
T
,如果有人想做一些像
a++++
这样愚蠢的事情,那是他们自己的问题,
a++
做了什么,一个天真的用户认为它做了什么?为一些
复杂的
类定义后增量真的明智吗?这样的用户不是天真的,而是无知的。不要这样做在这方面浪费时间。一旦你将值返回给用户,它就是他们的。应用
const
返回值也会抑制各种优化,因此你只会伤害那些不笨的人。此外,如果对右值调用
操作符+++
真的很糟糕,这是一个完全不同的问题,不是你的函数的反应我的建议是返回
T
,如果有人想做像
a++++
这样愚蠢的事情,那是他们自己的问题,
a++++
做了什么,一个天真的用户认为它做了什么?为一些
复杂的
类定义后增量真的明智吗?这样的用户不是naive、 但是无知。不要在这上面浪费时间。一旦你将你的值返回给用户,它就是他们的。应用
const
返回值也会抑制各种优化,所以你只是在伤害那些不愚蠢的人。另外,如果对右值调用
操作符+++
真的很糟糕,那是完全不同的问题,不是问题我们的函数有责任解决这个问题。如果只将后增量限制为左值,是否需要此重载?@juanchopanza问题是如何返回值,使后增量不能用于返回值。将后增量限制为左值和防止右值后增量都可以解决此问题这个问题,不是吗?我无法将这个重载添加到一个简单的测试类中-gcc5.4未能编译它。我做错了什么?@ArtemyVysotsky您必须使用
&
测试运算符++(int)和{/*…*/}来限定原始重载
。事实上,正如hvd所建议的,您根本不需要删除右值版本,只需限定左值一个就足够了。感谢您的回答。将原始重载更改为&version就足够了。我已经根据建议更新了gist-到目前为止,该类可以按预期工作。如果您只是限制po,是否需要此重载st增量到左值?@juanchopanza问题是如何以这样的方式返回值,即不能在返回值上使用后增量。限制后增量到左值和防止后增量到右值都可以解决这个问题,不是吗?我无法将此重载添加到简单的测试类中-gcc5.4无法com堆起来。我做错了什么?@ArtemyVysotsky你必须用
&
测试操作符++(int)&{/*…*/}来限定原始重载
。事实上,正如hvd所建议的,您根本不需要删除右值版本,只需限定左值一个就足够了。感谢您的回答。将原来的重载更改为&version就足够了。我已经根据建议更新了gist-到目前为止,该类按预期工作。