https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82959
Bug ID: 82959
Summary: g++ doesn't appreciate C++17 evaluation order rules
for overloaded operators
Product: gcc
Version: 8.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: ixsci at yandex dot ru
Target Milestone: ---
Having the following code:
#include <iostream>
using namespace std;
class Int
{
public:
Int() = default;
Int(int val):
m_Value{val}
{
}
Int operator++(int)
{
Int tmp{*this};
++m_Value;
return tmp;
}
bool operator&&(const Int& rhs) const
{
return m_Value && rhs.m_Value;
}
private:
int m_Value = 0;
};
template <typename T>
bool cleverFun(T& value)
{
return (cout << "first\n", value++) &&
(cout << "second\n", value++);
}
int main()
{
int i = 0;
Int complexI{};
cout << "==========SIMPLE INT============\n";
cleverFun(i);
cout << "==========COMPLEX INT============\n";
cleverFun(complexI);
};
The conforming C++17 compiler (to my knowledge) should output "first" then
"second" twice, but GCC outputs "second" then "first" with the overloaded &&
operator.