我有个问题:返回一个赋值表达式是什么意思?我有一个enum
,我已经覆盖了++:operator
。所以在我的简短示例中,可以在灯光之间切换-但代码中有一部分我不理解。代码编译后工作正常。
代码:
enum Traficlight
{green, yellow, red };
Traficlight& operator++(Traficlight& t)
{
switch (t)
{
case green: return t = Traficlight::yellow; //Here <--
case yellow: return t = Traficlight::red; //Here <--
case red: return t = Traficlight::green; //Here <--
default:
break;
}
}
int main()
{
Traficlight Trafic = Traficlight::green;
Trafic++;
if (Trafic == Traficlight::yellow)
{
cout << "Light is Yellow" << endl;
}
string in;
cin >> in;
}
return t = Traficlight::yellow
是什么意思,为什么我不能只是return Traficlight::yellow
?
5条答案
按热度按时间4si2a6ki1#
在返回指令中,运算符赋值给
t
,这是一个引用(修改它),然后返回值。这就是增量运算符的作用:同时修改并返回引用,以便增加的值可以用于另一个操作。
k2arahey2#
t = Traficlight::yellow
将Traficlight::yellow
写入t
。该表达式的结果也是Traficlight::yellow
,因此:等于:
在上面的函数中,对
t
的引用作为参数接收,因此更改t
的值实际上是相关的。agxfikkp3#
函数通过引用接收参数:
它是一个++运算符,所以语义上它必须递增它的操作数,然后返回对那个操作数的引用,所以你必须做两个动作:
这可以写在一行中,因为赋值运算符返回赋值。
hpxqektj4#
它将值赋给
t
变量(在您的代码中t
是引用类型,因此更改在外部可见),然后返回t
变量的值。kadbb4595#
表达式
Traficlight::yellow
将是一个 rvalue,并且您的函数在更改t
的值后返回对t
的引用,该值是一个 lvalue。赋值operator=
本身返回对其左侧参数的引用。该代码是格式不良的,一些旧的编译器认为它是IFNDR。
尽管表达式
Trafic++
中的后递增operator++
预期返回递增之前的值并且将具有不同的签名,所以这个实现是误导性的,看起来好像和预递增运算符++混在一起了。实际上看起来像是你在使用一个旧的不一致的编译器,它允许在enum
上使用内置的递增运算符(一些 * 古老 * 的Visual Studio?)。在这种情况下,这是一个bug,您的operator++
根本没有使用。将签名更改为
Traficlight& operator++(Traficlight& t, int)
将使其可编译,尽管行为将是非惯用的。++Trafic;
也将由标准编译器编译。PS.惯用的post-increment看起来像这样,没有返回引用:
++Torch
可以用作左值。Torch++
不能,它应该返回变量的旧值。很容易记住使用哪个签名-对于一元运算符,参数在运算符之后。如果参数在运算符之前,它必须是二进制的。除了这里,第二个参数不存在。