c++ 赋值运算符在return语句中是什么意思,比如return t =...?

uttx8gqw  于 2022-12-24  发布在  其他
关注(0)|答案(5)|浏览(182)

我有个问题:返回一个赋值表达式是什么意思?我有一个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

4si2a6ki

4si2a6ki1#

在返回指令中,运算符赋值给t,这是一个引用(修改它),然后返回值。
这就是增量运算符的作用:同时修改并返回引用,以便增加的值可以用于另一个操作。

k2arahey

k2arahey2#

t = Traficlight::yellowTraficlight::yellow写入t。该表达式的结果也是Traficlight::yellow,因此:

return t = Traficlight::yellow;

等于:

t = Traficlight::yellow;
return t;

在上面的函数中,对t的引用作为参数接收,因此更改t的值实际上是相关的。

agxfikkp

agxfikkp3#

函数通过引用接收参数:

Traficlight& operator++(Traficlight& t)

它是一个++运算符,所以语义上它必须递增它的操作数,然后返回对那个操作数的引用,所以你必须做两个动作:

// Assign new value to the t
t = Traficlight::yellow;
// Return rusult
return t;

这可以写在一行中,因为赋值运算符返回赋值。

hpxqektj

hpxqektj4#

它将值赋给t变量(在您的代码中t是引用类型,因此更改在外部可见),然后返回t变量的值。

kadbb459

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看起来像这样,没有返回引用:

Traficlight operator++(Traficlight& t)
{
    switch (t)
    {
    case green: t = Traficlight::yellow; return Traficlight::green;
    case yellow: return t = Traficlight::red; return Traficlight::yellow;
    case red: return t = Traficlight::green; return Traficlight::red;
    default:
        break;
    }
}

++Torch可以用作左值。Torch++不能,它应该返回变量的旧值。很容易记住使用哪个签名-对于一元运算符,参数在运算符之后。如果参数在运算符之前,它必须是二进制的。除了这里,第二个参数不存在。

相关问题