2

vc++(debug mode)和g++有不同的效果,用这段代码

测试.hh

class Test
{
public:
    int a, b, c;
    Test(int a, int b, int c) : a{ a }, b{ b }, c{ c } {      }

    Test& operator++();
    Test  operator++(int);

};
std::ostream& operator<<(std::ostream& os, const Test& t);

测试.cc

std::ostream& operator<<(std::ostream& os, const Test& t)
{
    os << "{ " << t.a << ',' << t.b << ',' << t.c << " }";
    return os;
}

Test Test::operator++(int)
{
    Test temp{ *this };
    operator++();
    return temp;
}

Test& Test::operator++()
{
    ++a; ++b; ++c;
    return *this;
}

主文件

Test t{ 1,2,3 };

std::cout << t << '\n'
          << t++ << '\n'
          << t;

在 vc++ 中,执行的结果是

{ 2,3,4 }
{ 1,2,3 }
{ 2,3,4 }

但在 g++ 中是

{ 1,2,3 }
{ 1,2,3 }
{ 2,3,4 }

那么,vc++ 中是否存在编译器错误或我没有学到的东西。

4

1 回答 1

3

不幸的是<<,它具有推动“排序”思想的心理作用。

虽然std::cout << a() << b() << c()传达了计算的想法a()b()然后c()这是(曾经)错误的。您只知道它们将按顺序放入输出流中,但它们可以按任何顺序计算(在 C++17 之前)。

最近已修复此问题(因此您观察到的差异可能取决于您使用的 C++ 标准),但不幸的是,仅适用于常见的特殊情况,例如为流输出而重载的左移运算符(IMO 另一个可悲的 C++ 选择有几个原因)。

于 2020-07-19T07:21:39.707 回答