[英]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
。 否則,從main
( basic.start.main )以外的函數的末尾流出會導致未定義的行為 。
您可能想查看clang的結果; 發出警告
警告:控制到達非無效函數的結尾[-Wreturn-type]
並導致無限遞歸。
實際上,該函數具有未定義的行為。 之所以可行,可能是因為它將對流的引用存儲在寄存器(例如EAX)中,並且編譯器使用該寄存器來傳遞返回值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.