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

            Bug ID: 119899
           Summary: Custom invoke has name collision with std::invoke,
                    without using namespace std
           Product: gcc
           Version: 16.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libgcc
          Assignee: unassigned at gcc dot gnu.org
          Reporter: frederik.hofe at pm dot me
  Target Milestone: ---

I get a name collision with std::invoke when using my custom invoke with a
std::ref parameter, without pulling in the std:: namespace!

There is a simple workaround by writing out the full namespace of my custom
invoke.

This happens with GCC and Clang. So I assume this is a libgcc issue.
MSVC accepts this code. All tested on x86-64.

This also needs C++17 or higher (When std::invoke was introduced)

https://godbolt.org/z/W45W7j14c

Or if godbolt forgets my code:
#include <functional>

namespace customNamespace {
    template<typename F, typename...Args>
    constexpr inline void invoke(F&& f, Args&&...args) {}

    template<typename F, typename...Args>
    constexpr inline void useMyCustomInvoke1(F&& f, Args&&...args) {
                         invoke(std::forward<F>(f),
std::forward<Args>(args)...); //namespace collision with std::invoke
        customNamespace::invoke(std::forward<F>(f),
std::forward<Args>(args)...); //Workaround
    }
}

int main(int argc, char* argv[]) {
    auto lambda = [](int x){};
    int   i = 2;
    customNamespace::useMyCustomInvoke1(lambda, i);           //no issue
    customNamespace::useMyCustomInvoke1(lambda, std::ref(i)); //triggers the
issue!
    customNamespace::useMyCustomInvoke1(std::ref(lambda), i); //triggers the
issue!
}

Reply via email to