在 C++ 中的一个声明语句中,在复制 constructor/initialization 的延续中使用链方法?

Use of the chain method in the continuation of the copy constructor/initialization in one declaration statements in c++?

如您所知,我们通常在方法链接中使用 return by reference,我在第一个代码中使用 return by reference 并且输出与我预测的一样。在第二个代码块中,当我没有通过引用使用 return 时,链被破坏并且没有生成我预期的输出,但是在第三个代码块中,我使用 chain 方法达到了期望的结果在一个声明语句中继续复制构造函数/初始化(不通过引用使用 return),问题是,保护链不被破坏的第三代码背后的逻辑是什么?

class Calc
{
private:
    int m_value;

public:
    Calc(int value = 0) : m_value{ value } {}

    Calc& add(int value) { m_value += value; return *this; }
    Calc& sub(int value) { m_value -= value; return *this; }
    Calc& mult(int value) { m_value *= value; return *this; }

    int getValue() { return m_value; }
};

int main()
{
    Calc calc;
    calc.add(5).sub(3).mult(4); // its OK and output 8

    std::cout << calc.getValue() << '\n';
    return 0;
}

class Calc
{
private:
    int m_value;

public:
    Calc(int value = 0) : m_value{ value } {}

    Calc add(int value) { m_value += value; return *this; }
    Calc sub(int value) { m_value -= value; return *this; }
    Calc mult(int value) { m_value *= value; return *this; }

    int getValue() { return m_value; }
};

int main()
{
    Calc calc;
    calc.add(5).sub(3).mult(4); // its NOT OK and output 5

    std::cout << calc.getValue() << '\n';
    return 0;
}

class Calc
{
private:
    int m_value;

public:
    Calc(int value = 0) : m_value{ value } {}

    Calc add(int value) { m_value += value; return *this; }
    Calc sub(int value) { m_value -= value; return *this; }
    Calc mult(int value) { m_value *= value; return *this; }

    int getValue() { return m_value; }
};

int main()
{
    Calc calc = Calc{0} // copy constructor / initialization
        .add(5) // method chaining
        .sub(3) // method chaining
        .mult(4); // method chaining, its OK and output 8

    std::cout << calc.getValue() << '\n';
    return 0;
}

what is the logic behind the third code that protects the chain from breaking?

链确实中断了,但您使用最终结果分配给 calc

Calc calc = Calc{0}.add(5).sub(3).mult(4);

相当于

Calc calc = Calc{2}.mult(4);

最终构造成 calc 的副本是乘以 4 的临时 Calc 对象。