https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84580
Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2018-02-27 Ever confirmed|0 |1 --- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- This change would meet the standard's requirement that a != b is equivalent to !(a == b) --- a/libstdc++-v3/include/debug/vector +++ b/libstdc++-v3/include/debug/vector @@ -725,7 +725,7 @@ namespace __debug inline bool operator!=(const vector<_Tp, _Alloc>& __lhs, const vector<_Tp, _Alloc>& __rhs) - { return __lhs._M_base() != __rhs._M_base(); } + { return !(__lhs == __rhs); } template<typename _Tp, typename _Alloc> inline bool It would change the behaviour for this program: #include <debug/vector> #include <cassert> struct foo { }; bool operator!=(std::vector<foo*> const& v1, std::vector<foo*> const& v2) { return &v1 != &v2; } int main() { __gnu_debug::vector<foo*> v1, v2; assert(v1 != v2); } Currently the operator!= for debug vectors calls the program-defined overload for std::vectors, but with the patch above it would call operator== for debug vectors which calls the standard operator== for std::vectors. This is probably OK, the program above is pathologically contrived, and meeting the standard requirements when _GLIBCXX_DEBUG is defined is more important, so that _GLIBCXX_DEBUG doesn't change semantics.