簡體   English   中英

級聯流插入運算符不起作用

[英]Cascading the stream insertion operator doesn't work

我正在閱讀有關重載流插入操作符(<<)的文章 它強調應該返回輸出流對象,以確保操作員正確級聯。 但是似乎沒有返回,輸出仍然正確,這是怎么回事?

#include<iostream>

class Rational
{
    friend std::ostream& operator<<(std::ostream&, const Rational&);

    private:
        int numerator;
        int denominator;
    public:
        Rational(int num, int den): numerator{num}, denominator{den} {}
};

std::ostream& operator<<(std::ostream& lhs, const Rational& rhs)
{
    lhs << rhs.numerator << "/" << rhs.denominator;
    //return lhs;
}

int main()
{
    Rational r1(3, 5);
    std::cout << "The value of r1 is " << r1 << std::endl; // After commenting return lhs; still works fine
}

這是UB,對於應該返回對象的函數,無需返回語句即可結束。 它可能工作良好,但不能保證。

從標准$ 6.6.3 / 2返回語句[stmt.return]

(強調我的)

從構造函數,析構函數或具有cv void返回類型的函數的末尾流出就等於沒有操作數的return 否則,從mainbasic.start.main )以外的函數的末尾流出會導致未定義的行為


您可能想查看clang的結果; 發出警告

警告:控制到達非無效函數的結尾[-Wreturn-type]

並導致無限遞歸。

實際上,該函數具有未定義的行為。 之所以可行,可能是因為它將對流的引用存儲在寄存器(例如EAX)中,並且編譯器使用該寄存器來傳遞返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM