https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92847

            Bug ID: 92847
           Summary: [C++20] ambiguous overload for ‘operator==’ ?
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: laurent.stacul at gmail dot com
  Target Milestone: ---

Hello,

Compiling the following reproducer with the gcc trunk and the option
-std=gnu++2a (c++2a), I get the following error:

#include <iostream>

template<typename T>
class A {
public:
    A() {}

    template<typename U>
    A(const A<U>&) {}

    bool operator==(const A<T>&) { return true; }
};

int main(int argc, const char *argv[])
{
    A<const std::string> a;
    A<std::string> b;
    if (a == b) {}
    return 0;
}

a.cpp: In function ‘int main(int, const char**)’:
a.cpp:25:11: error: ambiguous overload for ‘operator==’ (operand types are
‘A<const std::__cxx11::basic_string<char> >’ and
‘A<std::__cxx11::basic_string<char> >’)
   25 |     if (a == b) {}
      |         ~ ^~ ~
      |         |    |
      |         |    A<basic_string<[...]>>
      |         A<basic_string<[...]>>
a.cpp:15:10: note: candidate: ‘bool A<T>::operator==(const A<T>&) [with T =
std::__cxx11::basic_string<char>]’
   15 |     bool operator==(const A<T>&) {
      |          ^~~~~~~~
a.cpp:15:10: note: candidate: ‘bool A<T>::operator==(const A<T>&) [with T =
const std::__cxx11::basic_string<char>]’

When I compile with gcc 9.2, I have no issue. The generated code is the one I
expect (implicit call to the constructor A<std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> >
const>::A<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > >(A<std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> > > const&) then call to the
A<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>
> const>::operator==(A<std::__cxx11::basic_string<char, std::char_traits<char>,
std::allocator<char> > const> const&).

Can you tell me which C++ 20 rule I am breaking here ?

Thanks in advance for your reply,
Laurent

Reply via email to